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 を使っとこう。
#define MR_SHORTHAND
ですが、
#define MR_SHORTHAND 1
と書くのもありますが同じ意味でしょうか?