MagicalRecord2.0を使えるように準備する

簡単にCoreDataを使えるMagicalRecord2.0を試してみました。
まずはGithubからzipを落としてきます。git cloneでもOKです。
参考:MagicalRecord-Github


落としてきたらzipを展開します。


適当にプロジェクトを作ります。「ARC」はON
「Use CoreData」はノーチェックでOKです。
「MagicalRecord」は「ARC」や「iCloud」もサポートしています。





解凍したフォルダーをxcodeプロジェクトにドラッグ&ドロップします。


下のようにチェックをいれておきます。


次にCoreData+MagicalRecord.hをプロジェクト名-Prefix.pchファイルに宣言します。

#import <Availability.h>

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

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

これで必要な時にいつでもMagicalRecordのコードを呼び出せますが、、

この状態でビルドしようとするとこのようなエラーになります。



テスト用のプロジェクト等、一部のファイルがARCに対応していないようです。
取り敢えず今は不要と思われる「Project Files」フォルダを削除しました。


ようやくビルドOKかなと思うと又こんなエラーになります。

Undefined symbols for architecture i386:
"_OBJC_CLASS_$_NSAttributeDescription", referenced from:

CoreData.frameworkをリンクしたらこのエラーも消えました。
参考:プロジェクトに既存のフレームワークを追加

ではようやくMagicalRecordのコードを書いていきます。
まずは元々あるAppDelegate.mファイルに以下のコードを追加します。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //この1行でCoreDataを使う準備が完了
    //CoreDataStore.sqlite等のデフォルト名を与えてMagicalRecordを使う準備をする。
    [MagicalRecord setupCoreDataStack];    
    
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

同じくappDelegateのapplicationWillTerminateに
後片付けのコードをいれます。

- (void)applicationWillTerminate:(UIApplication *)application
{
    [MagicalRecord cleanUp];
}


次はCoreDataで保存する対象になるクラスを用意します。
ここではEmployeeというNSManagedObjectサブクラスを作りました。
追加したのは下の画像でフォーカスされている3つのファイルです。

参考:CoreDataで使うクラスを作る(動画)

ここまででMR_というprefix(接頭辞)つきでMagicalRecordの便利なメソッドが使えるようになります。

NSArray *people = [Person MR_findAll];

データの「保存」と「削除」を書いてみました。
コードは雑極まりないですが、まずはこれでログが確認できると思います。

#import "TestMagicAppDelegate.h"
#import "Employee.h"

@implementation TestMagicAppDelegate

@synthesize window = _window;

//追加 管理オブジェクトコンテキストの変数
NSManagedObjectContext *moc;

//追加 保存メソッド
- (void)saveEmployee{
    Employee *employee = [Employee MR_createInContext:moc];
    employee.name = @"tikidunpon";
    employee.age =  [NSNumber numberWithInt:27];
    NSArray *array = [Employee MR_findAll];
    
    for (Employee *emp in array) {
        NSLog(@"%@",emp.name);
        NSLog(@"%@",emp.age);
    }    
    [moc MR_save];
}

//追加 削除メソッド
- (void)deleteAllEmployee{
    [Employee MR_truncateAll];
    [moc MR_save];    
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //CoreDataStore.sqlite等のデフォルト名を与えてMagicalRecordを使う準備をする。
    [MagicalRecord setupCoreDataStack];    
    
    //追加 saveとdeleteをコメントアウト解除しながら切り替えて
    //データの保存と削除を確認できる。
    moc = [NSManagedObjectContext MR_defaultContext];
    [self saveEmployee];
    //[self deleteAllEmployee];    
    
    //以下略...
}

ログ内容----若干省略
2012-06-21 01:01:22.708 TestMagic[1643:fb03] tikidunpon
2012-06-21 01:01:22.708 TestMagic[1643:fb03] 27

とても参考にさせて頂いたサイト
CoreDataを直接使っていたプロジェクトをMagicalRecord利用に移行する