2015-10-14 105 views
0

我很抱歉加載可能看起來像是重複的問題。領域遷移問題

我第一次嘗試Realm - 我創建了一個測試項目來完成它。我在模型類中添加了另一個屬性,然後得到了有關所需更改和遷移的錯誤消息。我遵循指示,並在AppDelegate中設置了一些代碼進行遷移(儘管遷移塊是空的,因爲我刪除了所有記錄),但是在再次啓動後它碰到我的ViewController時崩潰,「提供的模式版本0比上一次設置的版本少1「,我無法超越它?

它在我的ViewController上失敗var realm = try! Realm()

我錯過了什麼?

回答

4

你似乎做得對。按照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 
+0

這是我的AppDelegate的代碼: Realm.Configuration.defaultConfiguration = Realm.Configuration( schemaVersion:1, migrationBlock:{遷移,oldSchemaVersion在 如果(oldSchemaVersion <1){ } }) let realm = try!境界() 工作正常,但是當它擊中的ViewController它彈了。 當你說卸載應用程序你是什麼意思? – Daniel

+0

好了,想通了,你的意思與卸載的話 - 謝謝 之前,我決定用領域堅持我需要的是舒服,我就能得到正確的遷移,讓我不要弄亂的用戶體驗。欣賞我試圖重現你的錯誤沒有成功採取 – Daniel

+0

的時間。雖然我注意到在途中發生的一些細節,並將它們添加到答案中。 – Edman