CoreData - shirai/SwiftLearning GitHub Wiki

CoreData

基礎

目標

  • CoreDataの概念を説明できる
  • マルチスレッド環境下での仕様に関して危険性を説明できる

わかったこと

  • 「オブジェクトの永続化」ができるフレームワーク
  • このようにオブジェクトとレコードの変換を行うフレームワークのことをO/Rマッピングフレームワークと呼ぶ
  • プログラムからDBのデータをオブジェクトとして扱うことができるのが利点

実装方法

  1. NSFetchRequestインスタンスを生成
  2. NSManagedObjectContextインスタンスを介してモデルデータを取得する。
  3. 2でNSManagedObjectのインスタンスの配列が返される(モデルデータを操作するラッパー的なクラス?)
  4. 取得したNSManagedObjectを介してデータの更新などをする
  5. 操作完了後に[managedObjectContext save:&error];を実行して、操作したモデルデータを永続化ストアに伝えて更新する

マルチスレッドでの危険性

  • NSManagedObjectContextがスレッドセーフではないため、スレッドごとにNSManagedObjectContextを用意する必要がある
  • Context間に親子関係を持たせることによって、子で行った更新を、親に反映させることができる
  • 更新を永続化するような処理は、「更新コンテキスト」「メインコンテキスト」「保存コンテキスト」の3つに分けることで、永続化に処理でバックグラウンドで行うことができる

マルチスレッドでの実装方法

  • 下記にようにConcurrencyTypeを設定することで、スレッドが割当てられる
//メインスレッド以外の独自のスレッド:NSPrivateQueueConcurrencyType
//メインスレッド:NSMainQueueConcurrencyType
NSManagedObjectContext *temporaryContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:スレッドのタイプ];
  • 下記の処理で親子関係を成り立たせることができる
temporaryContext.parentContext = _mainContext;
  • 下記のメソッドで親のスレッドに処理をマージすることができる
[temporaryContext save:&error];
  • Contextが管理するスレッド上で実行させたい処理はperformBlock:で指定する
[temporaryContext performBlock:^{
	NSManagedObject *managedObject = [NSEntityDescription insertNewObjectForEntityForName:@"User" inManagedObjectContext:temporaryContext];
	[managedObject setValue:@"hoge" forKey:@"name"];
}];

つぎにやること

  • 課題アプリ作成
  • 「最新iOSプログラミング徹底解説」8章(p394~)読み込み
  • 学習まとめ作成

参考

各要素

目標

  • NSManagedObjectについて説明できる
  • PersistentStoreCoordinatorについて説明できる
  • ManagedObjectContextについて説明できる

わかったこと

  • PersistentStoreCoordinatorとManagedObjectContextについては、プロジェクトを作る際に「Use Coredata」にチェックをつけると、勝手にメソッドをAppDelegateに作成してくれる

NSManagedObject

  • エンティティの実体を管理するクラスであり、永続化の仕組みが組み込まれている

PersistentStoreCoordinator

  • 永続化に必要なストレージへの処理を肩代わりしてくれる

ManagedObjectContext

  • プログラムの中で、マネージドオブジェクトの配列や集合の入出力を行う代理人
  • データの検索、挿入更新削除や Undo Redo を行うクラス

わからなかったこと

つぎにやること

  • 課題アプリ作成
  • 「最新iOSプログラミング徹底解説」8章(p394~)読み込み
  • 学習まとめ作成

マイグレーション

目標

  • マイグレーションについて説明できる
  • 自動マイグレーションを設定できる
  • モデルのバージョンを複数作成し、正しくデータ移行できる

わかったこと

  • マイグレーションとはデータなどを別の環境に移転したり、新しい環境に切り替えたりすることを意味する
  • CoreDataでは、簡単なマイグレーションであれば、設定次第で自動でマイグレーションを行う

実装方法

  1. CoreDataのモデルのバージョンを新規作成
  2. 新規作成したバージョンをカレントバージョンに設定
  3. 新規作成したバージョンに変更(属性追加など)を記述
  4. CoreDataのpersistentStoreを初期化時に、自動マイグレーションのオプションを渡す

<参考:AppDelegate.m>

NSDictionary *options = [[NSDictionary alloc] initWithObjectsAndKeys:
	[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
	[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
	nil];

_persistentStoreCoordinator = [NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel](/shirai/SwiftLearning/wiki/NSPersistentStoreCoordinator-alloc]-initWithManagedObjectModel:[self-managedObjectModel);

if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) {
	NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}

つぎにやること

  • 課題アプリ作成
  • 「最新iOSプログラミング徹底解説」8章(p394~)読み込み
  • 学習まとめ作成

参考