LoginSignup
2
3

More than 5 years have passed since last update.

realm マイグレーション

Last updated at Posted at 2017-09-01

データベースを使ってる場合、時間が経つにつれ、データモデルは変更されていくものです。
Realmでのデータモデルは、インターフェースに変更を加えるだけで、データモデルを変えられます。
例えば、以下のMyticketEntityモデルについて考えてみてください。
Personクラスについて、以前に異なる2つのスキーマバージョンをとっていた場合を考えてみましょう。

// v0
@interface MyticketEntity : RLMObject
@property NSString *firstName;
@property NSString *lastName;
@property int age;
@end

// v1
@interface MyticketEntity : RLMObject
@property NSString *fullName; // 追加したプロパティ(v0 → v1のときにfirstNameとlastNameを結合した)
@property int age;
@end

// v2
@interface MyticketEntity : RLMObject
@property NSString *fullName;
@property NSString *email;   // 追加したプロパティ
@property int age;
@end

TBDatabaseManager.m
RLMRealmConfiguration *config = [RLMRealmConfiguration defaultConfiguration];
//キーチェーンから復号キーを取得
NSData *keyData = [[LUKeychainAccess standardKeychainAccess] dataForKey:@"Encryption"];

// 暗号化されたRealmファイルを開きます
config.encryptionKey = keyData;
//現在のスキーマバージョンは2
config.schemaVersion = 2;
 
//マイグレーションブロック
config.migrationBlock = ^(RLMMigration *migration, uint64_t oldSchemaVersion) {
  // enumerateObjects:block:メソッドで保存されているすべてのMyticketEntityオブジェクトを列挙します
  [migration enumerateObjects:MyticketEntity.className
                        block:^(RLMObject *oldObject, RLMObject *newObject) {
    // スキーマバージョンが0のときだけ、'fullName'プロパティを追加します
    if (oldSchemaVersion < 1) {
      newObject[@"fullName"] = [NSString stringWithFormat:@"%@ %@",
                                oldObject[@"firstName"],
                                oldObject[@"lastName"]];
    }

    // スキーマバージョンが0または1のとき、'email'プロパティを追加します
    //初期値の設定も可能だが、はじめは何もないはずなので空とする
    if (oldSchemaVersion < 2) {
      newObject[@"email"] = @"";
    }
  }];
};
[RLMRealmConfiguration setDefaultConfiguration:config];

// スキーマバージョンを更新して、マイグレーションブロックを追加したので、
// 古いスキーマバージョンのRealmを開こうとすると
// Realmは自動的にマイグレーションを実行し、成功したらRealmを開きます。
RLMRealm *realm = [[TBDatabaseManager manager] getEncryptedRealmDb];
2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3