LoginSignup
28
28

More than 5 years have passed since last update.

MagicalRecord 2.2メモ

Last updated at Posted at 2014-06-13

試行錯誤してだいぶ理解がまとまってきたのでメモです。わりとお手軽に使えるライブラリですが、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];
}];

あとで書き足そうと思っているもの

  • マージ
  • マイグレーション
28
28
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
28