Tag Archives: Coredata

iOSアプリのCoreDataを扱いやすくしてくれるライブラリのMagicalRecord 2.0がリリースされました。
MagicalRecord 2.0はARC向けのものなっていて、ARCを使わないプロジェクト向けは1.8.3が最終バージョンとなるようです

導入方法自体は以前書いた記事とあんまり変わらないですが、少しARC対応等で違う所があるぐらいです。

以前と同じように、CoreDataのモデルクラスをmogeneratorで生成する際に、mogeneratorはデフォルトではARCに対応したモデルクラスを生成しないので、

$ mogenerator -m Sample/Sample.xcdatamodeld/Sample.xcdatamodel/ -O Sample/Models/
# これをARC対応版にするには --template-var arc=true をつける
$ mogenerator -m Sample/Sample.xcdatamodeld/Sample.xcdatamodel/ -O Sample/Models/ --template-var arc=true

というように–template-var arc=trueをつけて、ARC対応版のモデルクラスを生成するようにしてあげます。

MagicalRecordの導入自体はCoreDataをActiveRecord風に扱えるMagicalRecordの使い方と全く同じ方法で大丈夫です。

他にもMagicalRecord作者がいくつか記事を書かれてるので参考に

ref.

追記 : 2.1でメソッドの名前等大きく変わっているので、readme等を読み直しましょう。

MagicalRecordのREADMEを意訳 – Object for cutie

一時的なエンティティ

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を使った書き方もできるのでかなりスッキリと書ける。)

参考