29261


下記のモデルを作成した後

[code]

    class empMaster: Object {
        dynamic var empId:String = String()
        dynamic var empName:String = String()
    }
    
[/code]

プライマリキーを設定して、実行するとエラーになります

[code]

    class empMaster: Object {
        dynamic var empId:String = String()
        dynamic var empName:String = String()
    
        override class func primaryKey() -> String {
            return "empId"
        }
    }
    
[/code]

エラー内容

[code]

    fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=10 "Migration is required due to the following errors:
    - Primary Key for class empMaster has been added." UserInfo=0x7a628b00 {Error Code=10, NSLocalizedDescription=Migration is required due to the following errors:
    - Primary Key for class empMaster has been added.}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-800.0.46.2/src/swift/stdlib/public/core/ErrorType.swift, line 178
    
[/code]

このようなエラーを出さないようにするには、どのような方法がよろしいでしょうか？

環境  
Xcode8  
Realm Swift v2.0.0


CC BY-SA 3.0
2016-09-29T06:49:40.523
29234
2016-09-30T03:09:36.227
14947
question
swift ios realm
Realmでプライマリキーを設定するとエラーになる対処方法


エラーメッセージの通りで、モデルクラスを変更し、モデルの定義と既存のファイルのデータ構造が異なってしまった場合はマイグレーションが必要になります。

もし、まだリリースしていなくて、開発中にモデルクラスをいろいろ試しているという状態であれば、既存のファイルを消してやり直すだけでもOKです。  
既存のファイルを消すのはNSFileManagerなどでRealmのファイルを消すか、単にアプリケーションをアンインストールします。

もしくは、今回の例のようにマイグレーションが必要な場合に自動的にファイルを削除して作り直してくれる機能があります。

[code]

    let config = Realm.Configuration(deleteRealmIfMigrationNeeded: true)
    Realm.Configuration.defaultConfiguration = config
    
[/code]

とConfigurationオブジェクトに`deleteRealmIfMigrationNeeded = true`をセットしてあとは普通に`try!
Realm()`とすれば、マイグレーションが必要な場合は自動的に既存のファイルを削除して新しいデータ構造で作り直してくれます。

アプリがリリース済みで、既存のデータを引き継ぐ必要がある場合は、マイグレーションが必要になります。

Realm Swiftにはオートマイグレーションがありますので、データ構造の変更自体は、スキーマバージョンをあげるだけです。

[code]

    let config = Realm.Configuration(schemaVersion: 1) // 既存のファイルより大きな値ならなんでもいい
    Realm.Configuration.defaultConfiguration = config
    
[/code]

今回の例ではプライマリキーを追加しているので、その結果ユニーク制約に抵触する恐れがあります。

その場合は、重複しているデータを削除するか、プライマリキーを振り直すなどの処理が必要になります。そのようなマイグレーション時にデータを移行する処理はマイグレーションブロックに記述します。

[code]

    let config = Realm.Configuration(schemaVersion: 1, migrationBlock: { (migration, oldSchemaVersion) in
        // データ移行の処理を書く
        // 今回の場合は、プライマリキーの重複があれば解消する
    })
    
[/code]

以上、必要に応じていずれかの方法で対処してください。


CC BY-SA 3.0
2016-09-30T03:09:36.227
29261
2016-09-30T03:09:36.227
5519
29234
answer