Objective-C (iOS): はじめての MagicalRecord

概要

CoreData を使うときにこれを使うと便利というやつ。
Ruby on Rails 界隈で大人気の ActiveRecord を参考にしているそうです。

CoreData は、オブジェクトを RDB のレコードに変換する「O/R マッパー」という役割を持ち、RDB のテーブル・レコード・SQL を意識せずデータベースを扱う事ができます。
しかし、独自性が高く、習得が難しいとされており、MagicalRecord などのライブラリが人気です。

MagicalRecord は iOS アプリデータベースのための jQuery と言えますね!

 

手順

1. プロジェクトを作るときに User Core Data にチェック

2. .xcdatampdeld ファイルを編集

3. Add Entity から Artist というエンティティ(テーブル)を追加
  アトリビュート(フィールド)に name: String debut:Integer 16 で設定

4. 新規ファイルを追加から NSManagedObject subclass を作成
  行程3で作成した Artist Entity を選択していきます

5. MagicalRecord をプロジェクトに追加
  CocoaPods で入れてみます。一旦 Xcode を終了し、
  プロジェクトファイルがあるディレクトリに Podfile というファイルを作り、

pod 'MagicalRecord'

  と記載し、$ pod install でインストール、.xcodeproject ではなく .xcworkspace を今後作業で使用します。

6. MagicalRecord をプロジェクトにリンク
  Supporting Files/プロジェクト名-Prefix.pch から
  CoreData/CoreData.h をコメントアウトして、
  代わりに CoreData+MagicalRecord.h を追加

// #import <CoreData/CoreData.h>
#import "CoreData+MagicalRecord.h"

7. あとは DB に保存、取り出しを行うコードを書いていきます

サンプル的に AppDelegate.h に書いていく場合

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    
    // イニシャライズ
    [MagicalRecord setupCoreDataStack];
    
    // 使用するコンテキストの設定
    NSManagedObjectContext *magicalContext = [NSManagedObjectContext MR_defaultContext];
    
    // データの挿入
    Artist* band = [Artist MR_createEntity];
    band.name = @"Oasis";
    band.debut  = [NSNumber numberWithInt: 1993];
    Artist* band2 = [Artist MR_createEntity];
    band2.name = @"Blur";
    band2.debut  = [NSNumber numberWithInt: 1991];
    
    // データの更新
    Artist *bandA = [Artist MR_findFirstWithPredicate:
                     [NSPredicate predicateWithFormat:@"name = 'Oasis'"]];
    NSLog(@"bandA's debut : %@", [bandA debut]);
    bandA.debut = [NSNumber numberWithInt: 1994];
    
    // データの削除
    Artist *bandB = [Artist MR_findFirstWithPredicate:
                     [NSPredicate predicateWithFormat:@"name = 'Blur'"]];
    [bandB MR_deleteEntity];
    
    // マジカルレコードを保存
    [magicalContext MR_saveOnlySelfAndWait];
    
    // データの検索
    NSArray *all = [Artist MR_findAll];
    NSLog(@"magicalAll count : %lu", (unsigned long)[all count]);
    NSLog(@"magicalAll : %@", all);
    
    // データの全件削除
    NSArray *allArist = [Artist MR_findAll];
    for (NSInteger i = 0; i < [allArist count]; i++) {
        Artist *artist = [allArist objectAtIndex:i];
        [artist MR_deleteEntity];
    }
    
    return YES;
}