你似乎做得對。按照realm documentation:
在最起碼我們需要做的是更新版本與空塊,表明該模式已經升級(自動)的境界。
我的猜測是,你要麼創建配置和遷移,但不能將其設置爲默認的領域配置,或將配置爲時已晚(實例化一個境界後)。基於錯誤
你得到
提供的模式版本0低於最後一組第1版
似乎沒有被所有執行的遷移。無論如何,每次更新架構時,您還應該增加schemaVersion
的領域配置。該錯誤意味着您的配置包含的版本(0
)小於磁盤中現有數據庫的版本(1
)。在這種情況下,新配置的schemaVersion
至少應該爲2
(任何高於磁盤中的版本)。
在應用程序委託的application:didFinishLaunchingWithOptions:
,你會最低限度需要像以往實例化境界,因爲之前下列根據您當前的schemaVersion
。
let config = Realm.Configuration(
schemaVersion: 2, // Must be greater than previous version
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {
// minimally this can be empty
}
if (oldSchemaVersion < 2) {
// minimally this can be empty
}
print("Realm migration did run") // Log to know migration was executed
})
// Make sure to set the default configuration
Realm.Configuration.defaultConfiguration = config
我也建議你做一些記錄或實例境界之前設置斷點,無論是在遷移塊,並在您的視圖控制器。通過這種方式,您可以知道是否執行了遷移。
但是,由於您似乎只是在學習領域,所以我建議您現在忽略遷移的細節。爲了避免這種情況,無論何時更改數據庫模式,都可以從設備/模擬器中卸載應用程序。只要確保您使用schemaVersion
作爲0
,並且您將始終擁有一個全新的數據庫,因此無需遷移。
第二個選擇是使用in-memory realms。這樣的數據是不能跨應用程序啓動持續的這些都不是保存到磁盤,但它仍然像一個正常境界數據庫。這對於早期的原型製作來說非常完美。要得到其中的一個,你只需要給你的配置一個inMemoryIdentifier
。
let config = Realm.Configuration(inMemoryIdentifier: "ThisRealmIsNotStored")
Realm.Configuration.defaultConfiguration = config
這是我的AppDelegate的代碼: Realm.Configuration.defaultConfiguration = Realm.Configuration( schemaVersion:1, migrationBlock:{遷移,oldSchemaVersion在 如果(oldSchemaVersion <1){ } }) let realm = try!境界() 工作正常,但是當它擊中的ViewController它彈了。 當你說卸載應用程序你是什麼意思? – Daniel
好了,想通了,你的意思與卸載的話 - 謝謝 之前,我決定用領域堅持我需要的是舒服,我就能得到正確的遷移,讓我不要弄亂的用戶體驗。欣賞我試圖重現你的錯誤沒有成功採取 – Daniel
的時間。雖然我注意到在途中發生的一些細節,並將它們添加到答案中。 – Edman