CoreDataをActive Record風に扱えるようにするiOS用のライブラリである、MagicalRecordの導入方法についてのメモ書き

今回作成したサンプルは azu/MagicalRecord-Sample – GitHub に置いてあります。

まずはCoreDataのモデルの下準備から

1. CoreDataを使うプロジェクトを作成する(種類はなんでもいいけど、今回はEmptyプロジェクト)
プロジェクト名を MagicalRecordSample とした

NewImage

 

2. <プロジェクト名>.xcdatamodeldファイル があるので、データベースのモデルを作成する

今回は以下のようなENTITIESを一つ持ったモデルを作成した。

ENTITIES : Person
Attributes :

  • age
  • name

Xcode

3. 次に作成したPersonエンティティからmogeneratorを使ってモデルのカスタムクラスを作成する
mogenerator + Xmo’d からpkgをインストールするか、$ brew install mogenerator でインストールできる。

モデルクラスは適当にグループに分けたほうが見やすくなるので、先にModelsというグループ用のディレクトリを作っておいてる。

NewImage

 

mogeneratorをダウンロードしてインストールするとmogeneratorというコマンドがターミナルから利用できるようになる。
mogenerator -mでxcdatamodel(xcdatamodeldの中にある。紛らわしいので注意…)を指定して、-Oオプションでモデルクラスの出力先を指定する。(今回は先程作成しておいたModelsディレクトリに出力)

✗ mogenerator -m MagicalRecordSample/MagicalRecordSample.xcdatamodeld/MagicalRecordSample.xcdatamodel/ -O MagicalRecordSample/Models/

実行すると4つのPersonファイルが生成される。

この辺参照

生成されたファイルが入ったModelsディレクトリをそのままプロジェクトに追加する。

NewImage

これでモデル側の準備は終わりで、次は本題のMagicalRecordの導入方法について

MagicalRecordの導入方法

1. MagicalRecordをダウンロードする
中にあるSourceディレクトリをプロジェクトにD&Dなどで追加する。

2. <プロジェクト名>-Prefix.pch ファイルに

#ifdef __OBJC__
    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    #import <CoreData/CoreData.h>
    #import "CoreData+MagicalRecord.h"
    #define MR_SHORTHAND 1
#endif

という感じで#define MR_SHORTHANDを定義する。(これを書くと[Person findAll]みたいな書き方ができるようになる)
#import “CoreData+MagicalRecord.h”は <プロジェクト名>-Prefix.pchに書いて、MagicalRecordのヘッダファイルを読み込んでおく。

MagicalRecordの使い方

ここまでの準備が結構面倒だけど、MagicalRecordを導入しておけばCoreDataの操作がものすごく簡潔にできる。

ものすごく適当な例を書くと次のように読み書きが書ける。
README.mdに書かれてるように、最初に [MagicalRecordHelpers setup*]でデータの保存方法を指定する。(ファイルやメモリ等種類がある)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    /* MagicalRecord Sample Code */
    // sqliteファイルの保存名の設定
    [MagicalRecordHelpers setupCoreDataStackWithStoreNamed:@"MagicalRecordSample.sqlite"];
    // CoreDataのManagedObject Contextを設定する。
    NSManagedObjectContext *context = [NSManagedObjectContext MR_defaultContext];

    Person *person = [Person createEntity];// エンティティを作成する
    person.name = @"hito";
    person.age = [NSDecimalNumber decimalNumberWithString:@"18"];
    [context MR_save];// 保存

    // 保存した結果を取り出して表示
    NSLog(@"MagicalRecord FindAll");
    NSArray *result = [Person findAll];
    for(id per in result) {
        NSLog(@"name : %@ | age : %d",[per name],[[per age] integerValue]);
    }
    
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

createEntityで作成したエンティティに値を設定して保存、保存したデータは[モデルクラス findAll];で読み出せる。(抽出条件も結構簡単にかけるのでものすごく楽にできる)

NewImage

にメソッドとかいろいろ載っていますが、ヘッダーファイルやユニットテストのコードを見るとわかるように全部がreadmeに書かれてるわけではないです。
正直、自分もまだわからない部分が多いので、もっとCoreDataに詳しい方が記事を書いてくれることを期待します。
(今回全く書いてないけど、Blocksを使った書き方もできるのでかなりスッキリと書ける。)

参考

Post Navigation