試行錯誤してだいぶ理解がまとまってきたのでメモです。わりとお手軽に使えるライブラリですが、CoreDataの基礎知識がないとハマります(ハマりました)。
起動と終了
使いはじめる
MagicalRecord:setupCoreDataStack
メソッドで永続ストアの初期化と同時にアプリケーションデフォルトのNSManagedObjectContext
を初期化する。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
// 色んな処理
[MagicalRecord setupCoreDataStack];
return YES;
}
使い終わる
ドキュメントによればUIApplication:applicationWillTerminate:
でMagicalRecord:cleanUp
を呼べ、とある。
- (void)applicationWillTerminate:(UIApplication *)application
{
[MagicalRecord cleanUp];
}
NSManagedObjectContextの使い分け
MagicalRecordを使うとNSManagedObjectContextに、NSManagedObjectContext取得用のカテゴリが追加される。
NSManagedObjectContext:MR_defaultContext
とりあえずNSManagedObjectContextが欲しいときはコレ。
NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
NSManagedObjectContext:MR_contextWithParent:
NSManagedObjectContextを引数として渡すと、そのオブジェクトを親に持つNSManagedObjectContextを返す。親子関係を持ったオブジェクトが欲しいときに利用する。
- (void) viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextWithParent:self.moc];
// localContextで行う処理を書く
}
NSManagedObjectContext:MR_contextForCurrentThread
呼び出し時のスレッドを考慮してNSManagedObjectContextを返す。
- メインスレッド(UIスレッド?)であれば、アプリケーションデフォルトのNSManagedObjectContextを返す
- バックグラウンドスレッド(通信スレッド等)であれば、アプリケーションデフォルトのNSManagedObjectContextを親に持つNSManagedObjectContextを返す
NSManagedObjectの操作
生成
NSManagedObjectにもカテゴリが追加されています。NSManagedObject:MR_createInContext:
でオブジェクトの生成。
// スレッドを考慮したコンテキストで生成(内部的にMR_contextForCurrentThreadを使用)
SomeNSManagedObject *obj = [SomeNSManagedObject MR_createEntity];
// コンテキストを指定して生成
SomeNSManagedObject *obj = [SomeNSManagedObject MR_createInContext:localContext]
保存
コンテキストで保持しているNSManagedObjectを保存する。
// 非同期で保存
[localContext MR_saveOnlySelfWithCompletion:nil];
// 同期保存
[localContext MR_saveOnlySelfAndWait];
tips
MagicalRecord:saveWithBlock:でまとめて保存
MagicalRecord:saveWithBlock:
を使用すると、NSManagedObjectの操作と保存を1ブロックで行うことが出来ます。
[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) {
SomeNSManagedObject *obj = [SomeNSManagedObject MR_createInContext:localContext]
obj.name = @"hogehoge;
obj.lastAccess = [NSDate date];
}];
あとで書き足そうと思っているもの
- マージ
- マイグレーション