Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

[Swift] CoreDataを使ってみる

公開日: : 最終更新日:2014/10/22 iPhone App 開発, Swift


Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

SwiftでCoreData

今回はSwiftでCoreDataを使ってみます。
Xcodeプロジェクトのテンプレート[Master-Detail Application]を利用します。
言語はSwift、XCodeのバージョンは6.0です。

まずは、メニューのFile > New > Project…でテンプレート選択画面を表示します。
スクリーンショット 2014-10-10 13.40.43
Master-Detail Applicationを選択。

Product NameはMasterDetailTest、LanguageはSwift。
あとはUse Core Dataにチェックをお忘れなく。
スクリーンショット 2014-10-10 12.35.54

すると、ファイルが自動生成されます。
MasterViewControllerが最初の一覧画面。
DetailViewControllerが行選択で遷移された詳細画面になります。
試しに実行してみると、
スクリーンショット 2014-10-10 14.04.28
スクリーンショット 2014-10-10 14.04.33
+ボタンでデータが新規追加され、行選択で詳細画面に移動します。

テーブルの作成

今度はテーブルを作成してみます。
MasterDetailTest.xcdatamodeldを開いてデータを作成します。
このファイルにテーブル間のリレーション情報などを設定することも可能です。
まずはエンティティ名をSampleEntity、属性にid(Integer 32)、name(String)を設定します。
スクリーンショット 2014-10-10 13.36.02
次に、定義したSampleEntityのモデルクラスを作成します。
File > New > File…から新規ファイル画面を表示
NSManagedObject subclass を選択、エンティティの選択はSampleEntityにし、
LangageはSwiftにしてください。
スクリーンショット_2014-10-10_13_24_17
SampleEntity.swiftファイルが自動生成されました。
ソースはこちら。

import Foundation
import CoreData

class SampleEntity: NSManagedObject {

    @NSManaged var id: NSNumber?
    @NSManaged var name: String?

}

ここで各プロパティにオプショナルを設定してください。
変数の後に’?’を付加するとこでnilを許容できるようになります。
これがないと値取得時にエラーになります。
あと、Objective-Cでは@dynamicとなっていたものが、@NSManagedになっています。

ソースコードの編集

テンプレートのままではtimeStampを出力していますが、先ほど作成したテーブルを取得するように変更してみます。
処理の流れはこんな感じです。

  1. データの検索部分をSampleEntityテーブルから取得するように変更
  2. +ボタン押下で登録するときに、SampleEntityテーブルに登録するように変更(idのインクリメント)
  3. 一覧、詳細画面のデータ表示部分はSampleEntityテーブルのnameに変更

MasterViewController.swift

fetchedResultsController

画面がロードする毎にデータを取得します。コメントの部分は元のソースコードになります。

var fetchedResultsController: NSFetchedResultsController {
    if _fetchedResultsController != nil {
        return _fetchedResultsController!
    }

    let fetchRequest = NSFetchRequest()
    //let entity = NSEntityDescription.entityForName("Event", inManagedObjectContext:self.managedObjectContext!)
    let entity = NSEntityDescription.entityForName("SampleEntity", inManagedObjectContext:self.managedObjectContext!)
    fetchRequest.entity = entity

    fetchRequest.fetchBatchSize = 20

    //let sortDescriptor = NSSortDescriptor(key: "timeStamp", ascending: false)
    let sortDescriptor = NSSortDescriptor(key: "id", ascending: true)
    let sortDescriptors = [sortDescriptor]
    fetchRequest.sortDescriptors = [sortDescriptor]

    let aFetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest,managedObjectContext: self.managedObjectContext!, sectionNameKeyPath: nil, cacheName: "Master")
    aFetchedResultsController.delegate = self
    _fetchedResultsController = aFetchedResultsController

	var error: NSError? = nil
	if !_fetchedResultsController!.performFetch(&error) {
	     abort()
	}

    return _fetchedResultsController!
}

insertNewObject

データの登録処理です。
EventテーブルのtimeStampを設定している箇所をコメントアウトし、SampleEntityのname、idを設定するようにします。
getNextId関数はidの最大値 + 1を取得する処理です。
idにそれを設定し、nameは’name’ + ‘id’にします。

func insertNewObject(sender: AnyObject) {
    let context = self.fetchedResultsController.managedObjectContext
    let entity = self.fetchedResultsController.fetchRequest.entity
    //let newManagedObject = NSEntityDescription.insertNewObjectForEntityForName(entity.name, inManagedObjectContext: context) as NSManagedObject
    //newManagedObject.setValue(NSDate.date(), forKey: "timeStamp")

    let newSampleEntity = NSEntityDescription.insertNewObjectForEntityForName("SampleEntity", inManagedObjectContext: context) as SampleEntity
    newSampleEntity.id = NSNumber(int: self.getNextId())
    newSampleEntity.name = "name" + newSampleEntity.id!.stringValue

    var error: NSError? = nil
    if !context.save(&error) {
        abort()
    }
}

func getNextId() -> Int32 {
    let context = self.fetchedResultsController.managedObjectContext
    let entity = self.fetchedResultsController.fetchRequest.entity
    let fetchRequest = NSFetchRequest()
    fetchRequest.entity = entity

    let keyPathExpression = NSExpression(forKeyPath: "id")
    let maxExpression = NSExpression(forFunction: "max:", arguments: [keyPathExpression])
    let description = NSExpressionDescription()
    description.name = "maxId"
    description.expression = maxExpression
    description.expressionResultType = .Integer32AttributeType

    fetchRequest.propertiesToFetch = [description]
    fetchRequest.resultType = .DictionaryResultType

    if let results = context.executeFetchRequest(fetchRequest, error: nil) {
        if results.count > 0 {
            let maxId = results[0]["maxId"] as Int
            return maxId + 1;
        }
    }
    return 1
}

insertNewObjectはテーブル名、取得カラムを変えるだけでOK。
getNextIdは新たにNSFetchRequestを生成し、DB問い合わせの準備をします。
集計関数を使う場合はNSExpression、NSExpressionDescriptionを使用します。
expressionResultTypeは結果のタイプでDBの形式に合わせて設定します。
30行目のpropertiesToFetchにNSExpressionDescriptionを設定し、31行目でSQL問い合わせの結果タイプを設定します。

configureCell

データを表示する関数です。

func configureCell(cell: UITableViewCell, atIndexPath indexPath: NSIndexPath) {
    //let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject
    //cell.textLabel?.text = object.valueForKey("timeStamp")!.description
    let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as SampleEntity
    cell.textLabel?.text = object.name
}

DetailViewController.swift

configureView

データの表示をSampleEntityテーブルのnameに変更します。

func configureView() {
    if let detail: AnyObject = self.detailItem {
        if let label = self.detailDescriptionLabel {
            label.text = detail.valueForKey("name")!.description
        }
    }
}

以上、コーディングが終わりました。
実行してみます。
iOS Simulator Screen Shot 2014.10.14 17.07.30

iOS Simulator Screen Shot 2014.10.14 17.07.36

まとめ

テーブルを作成し、登録処理を変更しただけですがオプショナルの設定にかなり手こずりました。
忘れやすいのはManagedObjectの子クラス(データ定義クラス)でnilを許容する’?’を追加することです。
また、今回は集合関数maxを用いてデータを取得してみましたが、sumやminを使っても同様に取得可能です。

ad

関連記事

[Swift] スクリーンサイズを取得する

スクリーンサイズを取得 iPhoneの幅と高さを取得する関数を紹介します。 iOS8から画面の傾

記事を読む

[Objective-C] 共通関数をまとめたクラスを作ろう!

共通クラスとは? アプリを作っていると「この処理何回も書いてるなー」ということが多々あると思います

記事を読む

[Swift] プロパティリスト(plist)の値を取得

plistからデータを取得してみます。 こちらのエントリーも参考にしてみてください。 プロパテ

記事を読む

[Swift] optional値の設定(??)

optional値がnilの時 プロジェクトでのテンプレートを選択した時にソースコードが自動生成さ

記事を読む

[Objective-C] バージョン更新時に変更内容をアラートで出力する

アプリの更新内容を表示したい! バージョン更新時に変更内容を表示させたいのは、ユーザーがいちいちA

記事を読む

[Swift] CoreDataで検索したデータを削除する

CoreDataの検索と削除 前の投稿  CoreDataを使ってみる をふまえて今度は検索&削除

記事を読む

[Swift] 関数型プログラミング

関数型プログラミングについて、ストーリー仕立ての面白い記事がありましたので紹介します。 IQ1

記事を読む

[Objective-C] iPhoneアプリからのメーラー起動

今回はiPhoneアプリからメーラーを起動する処理を紹介します。 メーラー起動のコントローラー

記事を読む

[Swift] UINavigationControllerで戻るイベントを取得する

UINavigationController UINavigationControllerを使用し

記事を読む

[Swift] 定数クラスをつくってみる

Objective-cの場合 今回は共通にする定数をまとめるクラスを作ってみます。 まずはO

記事を読む

ad

Comment


  1. Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524
    Ratsitobaina より:

    Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524

    after spending 4hours for looking how to use nsexpression with swift in google, I found a good response at your site !!!.

    Thanks you very much.
    Ratsitobaina

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ad

[PHP] curl転送してみる(googleに)

curlでgoogle画像検索APIにアクセスしてみます。 cu

[PHP] PDOでMySQLの接続確認をする

PDO PHPでMySQLに接続する際には、mysql_connec

[PHP] ランダムな英数字を生成する

便利系メソッド 今回はPHPでランダムな英数字を作成してみます。

[Swift] プロパティリスト(plist)の値を取得

plistからデータを取得してみます。 こちらのエントリーも参考にし

[Swift] Asset Catalogについて

XCode5から追加されたAsset Catalog。 いままで標準

→もっと見る

  • 1978年の七夕生まれ。 25才でweb業界の門を叩き、28才でフリーランスに。 現在は、フリーランスでマークアップ中心に、wordpressのカスタマイズやデザインをしております。 また、iPhoneアプリの開発もしております。

Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524
PAGE TOP ↑

Warning: Use of undefined constant user_level - assumed 'user_level' (this will throw an Error in a future version of PHP) in /home/users/1/juny/web/hidef/wp-content/plugins/ultimate-google-analytics/ultimate_ga.php on line 524