
[code]

    class UserClass: Object {
        dynamic var id = 0
        dynamic var user: String = ""
        let colorData = List<Color>()
        override static func primaryKey() -> String? {
            return "user"
        }
    }
    
    class VariousColor: Object {
        dynamic var colorData = NSData()
        let chidLink = LinkingObjects(fromType: UserClass.self, property: "data")
    }
    
[/code]

を

[code]

    class UserClass: Object {
        dynamic var id = 0
        dynamic var user: String = ""
        dynamic var kisetsu: String = ""
        let colorData = List<Color>()
        override static func primaryKey() -> String? {
            return "user"
        }
    }
    
    class VariousColor: Object {
        dynamic var colorData = NSData()
        let chidLink = LinkingObjects(fromType: UserClass.self, property: "data")
    }
    
[/code]

といった感じにカラムを追加したいのですが、App store上のアプリで使用してるデータを移行する方法がわかりません。（そもそもあるのでしょうか）


CC BY-SA 3.0
2017-02-23T16:13:58.927
32907
2017-10-16T03:58:52.193
2017-02-24T03:03:48.453
5519
13782
question
swift ios realm
Realmのデータを失わずにカラムを追加してマイグレーションする方法


リリース後にモデルのデータ構造を変更した場合には、マイグレーションを行う必要があります。

Realmにおけるマイグレーションとは、モデルのデータ構造に変更があったをRealmに伝えることと、古いデータ構造から新しいデータ構造に実際のデータを移行することです。

まず、１つ目について、データ構造の変更が意図的であることをスキーマバージョンを変えることでRealmに教えます。そうでないと、Realmはデータ構造が既存のファイルと一致しないことが意図的なのか、間違ったファイルを開いたのか区別できないからです。

スキーマバージョンは`Realm.Configuration`オブジェクトを使って指定します。

[code]

    let config = Realm.Configuration(schemaVersion: 1)
    let realm = try! Realm(configuration: config)
    
[/code]

上記のように`schemaVersion`を指定して`Realm.Configuration`オブジェクトを作り、Realmをインスタンス化する際のパラメータとして渡します。

このとき、古いデータ構造から新しいデータ構造にデータの移行がない場合はこれだけでOKです。既存のファイルのデータ構造を変換し、新しいデータ構造のファイルにデータをコピーするところまで自動的にRealmがやってくれます。  
ここでいう「データの移行」とはデータの変換を伴うかどうかです。  
例えば、[ドキュメント](https://realm.io/jp/docs/swift/latest/#section-40)にあるような

[code]

    class Person: Object {
        dynamic var firstName = ""
        dynamic var lastName = ""
        dynamic var age = 0
    }
    
[/code]

`firstName`プロパティと`lastName`プロパティを一つの`fullName`プロパティに変換するような場合です。

[code]

    class Person: Object {
        dynamic var fullName = ""
        dynamic var age = 0
    }
    
[/code]

このような場合は、さらに`migrationBlock`引数を使って、データの変換処理を書きます。

今回の場合、新しく`kisetsu`というプロパティを追加しただけなので、そのプロパティに対して古いデータから何かを設定することはないと思いますので、`migrationBlock`を書く必要はありません。

スキーマバージョンを上げてRealmを開くだけで、自動的に新しい`kisetsu`プロパティが追加され、それ以外のデータはそのままコピーされます。

より詳しくはドキュメントをご覧ください。  
<https://realm.io/jp/docs/swift/latest/#section-40>


CC BY-SA 3.0
2017-02-24T03:03:30.060
32914
2017-02-24T03:03:30.060
5519
32907
answer