CoreData の O/Rマッパー MagicalRecord を使う

magicalpanda/MagicalRecord

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 <availability .h>
 
#ifndef __IPHONE_5_0
#warning "This project uses features only available in iOS SDK 5.0 and later."
#endif
 
#ifdef __OBJC__
    #import <uikit /UIKit.h>
    #import <foundation /Foundation.h>
 
    #define MR_SHORTHAND
    #import "CoreData+MagicalRecord.h"
#endif

こんな感じで読みこめばOKです。MR_SHORTHAND を追加すると、短いメソッド名が使えるようになります。

次に、Build Phases の設定から、Link Binary With Libraries へ CoreData.framework を追加します。
Link Binary With Libraries

最後に、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 を使っとこう。

CoreData の O/Rマッパー MagicalRecord を使う

Objective-C で base64エンコード

 Objective-C で base64エンコードする方法を調べていたけど、特にこれといったライブラリもないようです。

 Any base64 library on iphone-sdk? のスレッドで、カテゴリを使って NSString に機能を拡張しているサンプルがありました。ただ、そのままだと上手くエンコード出来なかったので、若干修正して github に置いておきました。

 ソースコード -> ecpplus / objective-c-lib / base64

Objective-C で base64エンコード