Relationship付きのRLMObjectのマイグレーションでハマった。
環境
Objective-C版のRealmをSwiftから使っています。
RealmSwiftじゃないのでご注意下さい。
データ構造
例えば、イベントを管理するアプリを作っていたとして
- Event
- title:String
- atendees:RLMArray<Person>
- Person
- name
という構造を以下のように変更しようとしてハマった。(実際にはありえない設計なのはご愛嬌)
- Event
- title:String
- names:[String]
migration
データ構造を変更すると、SchemaVersionを上げてマイグレーションを書く必要があり、この場合は↓のようなmigrationブロックを書く必要があり、
RLMRealm.setSchemaVersion(version, forRealmAtPath: RLMRealm.defaultRealmPath()) { (migration, oldVersion) -> Void in
if oldVersion < newVersion {
migration.enumerateObjects(Event.className(), block: { (oldObject, newObject) -> Void in
// ここにatendeesのデータをnamesに移行する処理を書いていく
})
}
})
atendeesは以下のように取り出すのですが、
let atendees = oldObject["atendees"] as RLMArray
このatendeesのnameプロパティを直感的に呼び出そうとして以下のようなコードを書くかもしれません。(というか自分はこうやって書いてた)
for atendee in atendees {
let person = atendee as! Person // ここでキャストできないよとエラーがでる
let name = person.name
}
それではどうやってnameを取り出すかというと
for atendee in atendees {
let name = atendee["name"]
}
これだけでした。
今考えると最初からこう書けば良かったなって思うんですが、relationship付きのRealmObjectのマイグレーションの情報がなかったのでまとめました。
同じようにハマっている人の助けになれば!