MagicalRecord2.0を使えるように準備する
簡単にCoreDataを使えるMagicalRecord2.0を試してみました。
まずはGithubからzipを落としてきます。git cloneでもOKです。
参考:MagicalRecord-Github
適当にプロジェクトを作ります。「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利用に移行する