データベースを使ってる場合、時間が経つにつれ、データモデルは変更されていくものです。
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];