CoreData の O/Rマッパー MagicalRecord を使う

magicalpanda/MagicalRecord

CoreData の ORMである MagicalRecord の導入メモ。

メソッド名は Rails に近い感じです。何より MagicalRecord っていう名前がお気に入りなので使っています。

導入

動作条件は、

MagicalRecord Platform Requirements:

iOS5.x or newer, or Mac OS 10.7 and newer
ARC

とのことです。

CocoaPods が使えます。Podfile に追加してインストール。

Podfile

platform :ios, '6.1'
pod 'MagicalRecord'
% pod install

プロジェクトの .pch ファイル "{プロジェクト名}-Prefix.pch" で MagicalRecord を読み込みます。

{プロジェクト名}-Prefix.pch

#import 

#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif

#ifdef __OBJC__
    #import 
    #import 

    #define MR_SHORTHAND
    #import "CoreData+MagicalRecord.h"
#endif

こんな感じで読みこめばOKです。MR_SHORTHAND を追加すると、短いメソッド名が使えるようになります。

次に、Build Phases の設定から、Link Binary With Libraries へ CoreData.framework を追加します。

最後に、ApplicationDelegate.m の起動処理あたりで、初期化処理を呼べば準備は完了です。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // 初期化処理
    [MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"nakamoto.sql"];
    return YES:
}

使い方

オブジェクトの保存

CoreData でのモデルの作り方は通常と同様です。Photo(photoId: Integer32, comment: String, tag: String) とかテキトウに作って試してみます。

NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];

Photo* photo = [Photo MR_createEntity];
photo.photoId = [NSNumber numberWithInt:"121"];
photo.comment = @"北極たべます";
photo.tag     = @"ramen";
NSError* error;
[photo save:error];

オブジェクトの取得

1つ取得

Photo *photo = [Photo findFirstByAttribute:@"photoId" withValue:[NSNumber numberWithInt:"121"]];

全部取得

NSArray *photos = [Photo findByAttribute:@"tag" withValue:@"ramen"];

更新

NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];
Photo *photo = [Photo findFirstByAttribute:@"photoId" withValue:[NSNumber numberWithInt:"121"]];
photo.comment = @"すみません。冷やし味噌にしてもいいですか?";
NSError* error;
[context save:error]

削除

Photo *photo = [Photo findFirstByAttribute:@"photoId" withValue:[NSNumber numberWithInt:"121"]];
[photo deleteEntity];

昔使ってたときは、 save だと上手くいかないパターンがあって saveNestedContexts を使ってたんだけど、今の最新版の 2.1 だと deprecated になってたので save を使っとこう。

コメント

  1. #define MR_SHORTHAND

    ですが、

    #define MR_SHORTHAND 1

    と書くのもありますが同じ意味でしょうか?

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です