目次

プロジェクトの作成

構成要素

Persistent store

  • バックエンド。SQLite3とか。

Data model

  • テーブルスキーマ。
  • Xcodeのデータモデルエディタで作る。.xcdatamodeldに保存される。
  • Object-CのクラスとしてはNSManagedObjectModelに対応。
    - (NSManagedObjectModel *)managedObjectModel {
        
        if (managedObjectModel_ != nil) {
            return managedObjectModel_;
        }
        NSString *modelPath = [[NSBundle mainBundle] pathForResource:@"CoreData" ofType:@"momd"];
        NSURL *modelURL = [NSURL fileURLWithPath:modelPath];
        managedObjectModel_ = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
        return managedObjectModel_;
    }
    

Persistent store coordinator

  • Persistent storeとData modelを使ってManaged objectとを作り出す。
    - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
        
        if (persistentStoreCoordinator_ != nil) {
            return persistentStoreCoordinator_;
        }
        
        NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"CoreData.sqlite"]];
        
        NSError *error = nil;
        persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
        if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }    
        
        return persistentStoreCoordinator_;
    }
    
  • Managed object contextで管理される。

Managed object and managed object context

  • Managed ObjectsはDTO(みたいなもんか)。
  • Key-Value Coding対応。
    NSDate* t = [managedObject valueForKey:@"updateDate"]
  • Managed Object ContextはManaged Objectsを管理する。Persistent store coordinatorを使う。

Fetch requerst

  • 条件を駆使してオブジェクトを取り出す。

データモデルエディタ

起動方法

.xcdatamodelをクリックすると起動する。

エンティティ

  • テーブルに該当。
  • 左上のペインで追加削除できる。

プロパティ

  • テーブルのカラムに該当。
  • 選択されたテーブルのカラムが一覧表示される。

属性

  • カラムの型に該当。
  • 選択されたカラムの属性が表示される。

Fetch Results Controller

  • NManagedObjectsを管理されているオブジェクトを表示したり削除したりするのを助けるcontroller。
  • イベントが発生するとdelegateメソッドが呼び出されるのでそこでビューを更新したりする。

関連

  • To-Manyの場合もTo-Oneの場合も逆関連を設定しておいたほうが便利。
  • どちらか一方で関連づけるともう一方の関連も動的にメンテナンスされる。
  • あるオブジェクトに関連づけられた子オブジェクトの集合からNSFetchedResultsControllerを生成したい場合、親オブジェクトのIDをNSPredicateに指定すると良い。
  • 例えば本棚に多数の本が関連づけられているとして、以下のようにNSPredicateを指定する。book.shelfは本から本棚への逆関連。Shelfはbooksとしてbookを所有為ている場合(%@"でobjectIDによる絞り込みが実現)。
            let fetchRequest = NSFetchRequest()
            let entity = NSEntityDescription.entityForName("Book", inManagedObjectContext: managedObjectContext)
            fetchRequest.entity = entity
            let pred = NSPredicate(format: "shelf=%@", argumentArray: [shelf])
            fetchRequest.predicate = pred
    

Tips

transientプロパティの使いどころって?

新規オブジェクトのキャンセル処理

  • 保存ボタンを押した際に、insertNewObjectForEntityForNameを呼び出す方法
  • rollback()を使う。
  • キャンセル時にdeleteObjectする。ちょっとだけ本格的なiPhone Core Dataアプリケーションへの拡張…。deleteするのが一番簡単?
  • CoreDataBooks。CoreDataBooks。子コンテキストを作成し追加処理を分離。
    NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
            [addingContext setParentContext:[self.fetchedResultsController managedObjectContext]];
    

初期データの投入

トラブルシューティング

Xcode 8 + Swift 3での不具合

  • モデルクラスの生成はxcdatamodeldを選択して、Editor > Create NSManagedObjectから実行。
  • モデル名+CoreDataClass.swiftに不完全なimport文が追加されてエラーとなるのでそれは削除する。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-01-16 (月) 14:29:22