2017-02-22 22 views
0

問題:不兼容的CoreData存儲會始終導致崩潰嗎?

我們最近推出CoreData到我們的應用程序,和之前發佈了一個不完整的CoreData模型版本。在那個發行版本中,我們從來沒有實現將數據寫入sqlite數據庫的代碼,只有模型被實現。

在我們的內部測試中,我們會將設備恢復到先前交付的不完整模型,然後更新到較新的模型,而不必執行遷移,也不會遇到不兼容的商店異常。

但是,在我們的測試版測試中,我們發現存在因不兼容的商店而導致崩潰的現有用戶,而一些現有用戶則沒有。

問:

難道不兼容的商店總是導致崩潰,並且如果是這樣,爲什麼我們不能從舊版本升級到不同的CoreData模型時遇到崩潰?我應該提到,當我們對最新的CoreData模型進行更改時,我們確實會拋出不兼容的存儲錯誤,但是當我們恢復到原始版本的核心數據模型時,我們不會看到拋出此異常。

+0

當你在coredata中進行任何更改時,你必須刪除舊版本並使用新版本,如果你仍然使用舊版本,所以它會導致你崩潰。 –

+0

看看:https://www.raywenderlich.com/27657/how-to-perform-a-lightweight-core-data-migration – raki

+0

如果你在安裝之前刪除你的設備的應用程序,那麼它沒有CoreData架構衝突,所以沒有崩潰。如果您的測試用戶在使用具有不同CoreData架構的應用程序的新版本之前未將應用程序從其設備上刪除,那麼架構中的衝突將導致崩潰。 – Zhang

回答

0

要回答你的問題,如果你有下面的代碼行中調用的項目

[__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                configuration:nil 
                   URL:storeURL 
                  options:nil 
                  error:&error]) 

代碼由Xcode的自動添加,當你設置與CoreData然後一個項目是,不兼容的商店總會引起崩潰,除非你進行輕度遷移或重度遷移,這取決於你的情況。

輕度遷移非常簡單直接,但您必須遵守一些規則。對於輕遷移更改的代碼,以上述行:

[__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
                 configuration:nil 
                    URL:storeURL 
                   options:@{NSMigratePersistentStoresAutomaticallyOption:@YES, NSInferMappingModelAutomaticallyOption:@YES} 
                   error:&error]) 

您可以查看更多關於輕量級遷移上developer.apple

您也應該檢查所發佈的評論@raki的鏈接。

+0

謝謝,danypata。回顧一下我們發佈的不完整的核心數據構建,我們擁有聲明持久性存儲協調器的代碼,但它永遠不會被調用。這是爲什麼我們只看到一些用戶崩潰,但不是全部? 我們的行動計劃是徹底刪除持久存儲(如果它不兼容),然後創建一個新存儲並從我們的服務器加載數據,因爲遷移可能會很重。我們已經將本地數據與我們的外部服務器同步,因此代碼即插即用。關於這種方法的想法? –

+0

我不知道爲什麼它會崩潰,如果代碼從未被調用,這意味着核心數據根本沒有設置,崩潰可能來自其他地方。關於重新創建持久性存儲,在我看來,如果您不使用核心數據關係(一對多,多對多),我會直接緩存文件,因爲您將所有數據同步你的服務器。對於核心數據來說,更好的選擇是Realm(覈對它),它的速度令人難以置信,但是像核心數據你必須處理遷移,實際上我不認爲有一種不需要某種遷移的緩存方法。 – danypata