LoginSignup
12
11

More than 5 years have passed since last update.

Realmのマイグレーションでハマった【Relationship付きObject】

Posted at

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のマイグレーションの情報がなかったのでまとめました。

同じようにハマっている人の助けになれば!

12
11
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
12
11