33184


App
StoreにあがってるアプリはRealmを初めて使ったままのスキーマ定義なのでスキーマは変更しておりません。それゆえ、configやスキーマバージョンも書いておりません。

スキーマ定義を変更する必要が出たので今回ローカル上でスキーマのバージョンを上げてマイグレーション処理を行ったりと色々試行錯誤しましたがうまくいかなく、Simulatorで一度アプリを削除してバージョンを０にしたところビルドもマイグレーションもできました。

ただApp
store上のアプリは`didFinishLaunchingWithOptions`で定義をせずにアプリを申請していたため、次にアプリをアップデートする際には`didFinishLaunchingWithOptions`のブロック内にスキーマバージョンを上げて記述し、書かなければならないのですがこの際の値は`0`で問題ないのでしょうか。


CC BY-SA 3.0
2017-03-04T05:47:59.723
33085
2017-03-11T18:53:34.030
20923
question
swift ios realm
App storeへのRealm使用アプリの申請の際のスキーマバージョンについて


Realmのファイルは各ユーザーのデバイスにそれぞれファイルが存在するわけですので、手元でアプリを削除してうまくいってもリリースされたアプリを使うユーザーのデバイスではそうはなりません。すでにそのアプリを利用しているユーザーのデバイスには変更前のスキーマのファイルがあるので、アプリをバージョンアップした際にはスキーマが一致しないので、スキーマバージョンを上げていなければクラッシュします。

まだアプリをAppStoreで配布してなければ、もちろん開発時は自由に試行錯誤できますが、一度リリースしてしまったなら、アップデートでスキーマを変更するならスキーマバージョンも合わせて上げる必要があります。

ただし、既存のデータを消してしまってもいいのであれば、`Realm.RealmConfiguration.deleteRealmIfMigrationNeeded`プロパティを使うと、マイグレーションが必要な場合は自動的に既存のファイルを消して作り直すということを自動的にやってくれます。

スキーマバージョン0から1のマイグレーション時はデータ削除、1から2のマイグレーション時はデータ移行をする、としたい場合は、私なら下記のように書きます。条件に応じて`deleteRealmIfMigrationNeeded`プロパティを切り替える方法よりも意図が明確になります。

[code]

    let config = Realm.Configuration(schemaVersion: 2, migrationBlock: { (migration, schemaVersion) in
        if schemaVersion < 1 {
            migration.deleteData(forType: "ModelA")
            migration.deleteData(forType: "ModelB")
            migration.deleteData(forType: "ModelC")
        }
        if schemaVersion < 2 {
            migration.enumerateObjects(ofType: "ModelA") { (newObject, oldObject) in
                ...
            }
            migration.enumerateObjects(ofType: "ModelB") { (newObject, oldObject) in
                ...
            }
            migration.enumerateObjects(ofType: "ModelC") { (newObject, oldObject) in
                ...
            }
        }
    })
    let realm = try! Realm(configuration: config)
    
[/code]


CC BY-SA 3.0
2017-03-08T05:34:51.313
33184
2017-03-11T18:53:34.030
2017-03-11T18:53:34.030
5519
5519
33085
answer