CoreData - shirai/SwiftLearning GitHub Wiki
CoreData
基礎
目標
- CoreDataの概念を説明できる
- マルチスレッド環境下での仕様に関して危険性を説明できる
わかったこと
- 「オブジェクトの永続化」ができるフレームワーク
- このようにオブジェクトとレコードの変換を行うフレームワークのことをO/Rマッピングフレームワークと呼ぶ
- プログラムからDBのデータをオブジェクトとして扱うことができるのが利点
実装方法
- NSFetchRequestインスタンスを生成
- NSManagedObjectContextインスタンスを介してモデルデータを取得する。
- 2でNSManagedObjectのインスタンスの配列が返される(モデルデータを操作するラッパー的なクラス?)
- 取得したNSManagedObjectを介してデータの更新などをする
- 操作完了後に[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~)読み込み
- 学習まとめ作成
参考
- iOSアプリでデータベース(CoreData)を使う時に必要な知識をまとめてみた - Swift編 -
- [Objective-C] CoreDataを使う
- CoreDataの非同期処理 - UIスレッドを止めないために
各要素
目標
- NSManagedObjectについて説明できる
- PersistentStoreCoordinatorについて説明できる
- ManagedObjectContextについて説明できる
わかったこと
- PersistentStoreCoordinatorとManagedObjectContextについては、プロジェクトを作る際に「Use Coredata」にチェックをつけると、勝手にメソッドをAppDelegateに作成してくれる
NSManagedObject
- エンティティの実体を管理するクラスであり、永続化の仕組みが組み込まれている
PersistentStoreCoordinator
- 永続化に必要なストレージへの処理を肩代わりしてくれる
ManagedObjectContext
- プログラムの中で、マネージドオブジェクトの配列や集合の入出力を行う代理人
- データの検索、挿入更新削除や Undo Redo を行うクラス
わからなかったこと
つぎにやること
- 課題アプリ作成
- 「最新iOSプログラミング徹底解説」8章(p394~)読み込み
- 学習まとめ作成
マイグレーション
目標
- マイグレーションについて説明できる
- 自動マイグレーションを設定できる
- モデルのバージョンを複数作成し、正しくデータ移行できる
わかったこと
- マイグレーションとはデータなどを別の環境に移転したり、新しい環境に切り替えたりすることを意味する
- CoreDataでは、簡単なマイグレーションであれば、設定次第で自動でマイグレーションを行う
実装方法
- CoreDataのモデルのバージョンを新規作成
- 新規作成したバージョンをカレントバージョンに設定
- 新規作成したバージョンに変更(属性追加など)を記述
- 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~)読み込み
- 学習まとめ作成