2012-09-04 57 views
2

今天上午,我們有我們的iPhone應用程序帶來了很大麻煩。我們甚至不得不從商店裏拿走它。應用更新後的麻煩很大。 CoreData遷移錯誤

事情是,我們對xcdatamodel進行了真正的小改動。我們認爲更新過程會自動關注正確的交換方式,直到我們發現CoreData遷移存在爲止。

我們正在使用UIManagedDocument連接到持久性存儲。

怎麼可能與新的交換文件?在我們開發時,我們只是從設備上卸載了整個應用程序,然後再次安裝,一切正常。我們如何在更新的應用程序商店中模擬此過程?

UPDATE

我嘗試設置這樣的

_database = [[UIIManagedDocument alloc] init]; 
NSMutableDictionary *options = [[NSMutableDictionary alloc] init]; 
[options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption], 

_database.persistentStoreOptions = options; 

遷移選項,但應用仍與

**終止應用程序崩潰是由於未捕獲的異常 'NSInternalInconsistencyException',原因:'This NSPersistentStoreCoordinator沒有持久性存儲。它不能 執行保存操作。'


回答

2

這裏的關鍵是管理你的xcdatamodel文件的多個版本。一個版本是當前版本,用於打開根據舊版本創建的數據存儲。這樣做時,您可以使用遷移映射將一個模型轉換爲另一個模型。這全部解釋爲here

至於你的問題:你如何模擬更新過程中,其實你不需要做什麼特別的:

  1. 安裝舊版本;

  2. 填充一些數據,其數據存儲;

  3. 通過Xcode安裝較舊版本的較舊版本;

較新版本將具有較新的數據模型;當安裝在舊版本之上時,它將找到較舊的數據存儲並且將不得不嘗試並遷移它。這正是通過App Store進行更新時發生的情況:應用程序二進制文件被替換,但其沙箱數據保持不變,所以新的二進制文件會在其中找到它。

希望這會有所幫助。

編輯:

您的代碼被縮短,所以我不知道你有沒有,但你可以嘗試使用:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

也看看this post

在另一個硬幣上,自動遷移不會總是有效,它取決於您對模型所做的更改類型;當它不起作用時,您需要指定一個自定義遷移模型。 This is a very informative post關於這個話題。