iphone - objective - ios core data




我需要做些什麼才能讓Core Data自動遷移模型? (7)

我已閱讀關於核心數據模型自動/輕量級遷移的文檔 - 但在實現它的實際中遇到問題。

據我了解,應用程序應該注意到它的模型和設備上存在的模型已經不一樣了。 如果您只添加了屬性或關係以及類似的簡單更改,則模型應自動升級。

任何指針 - 我需要在xCode中設置一些東西嗎?


Grouchal的答案是完美的...但是如果你仍然有“無法合併具有兩種不同實體的模型xxx”,即使清理了幾次構建之後......你可能會遇到如何加載managedObjectModel的問題。看看這個......幫我修好了..

核心數據遷移問題



另外,如果你偶然發現了這個帖子,就像我一樣,在獲得“用於打開商店的模型與用於創建商店的模型不兼容”錯誤之後,您只是使用模擬器進行調試,並且想要完全替換舊模型安裝,您可以重置模擬器應用程序或從模擬器刪除您的應用程序也可能工作。

直到閱讀這裡的帖子之前,我都沒有想到嘗試這些,在這一點上,我意識到我已經在模擬器中安裝了應用程序,然後改變了模型,導致上述運行時錯誤。


小編輯到@Grouchal上面Xcode版本5的真棒說明:

舊的:2.選擇頂部的設計菜單 - 然後選擇數據模型 - 然後選擇添加模型版本

版本5+:2.選擇編輯器菜單,然後添加模型版本...,輸入您的版本名稱和基於模型(從列表中選擇您的原始模型)


我現在發現這很簡單 - 一旦你知道在哪裡看。

在我的AppDelegate中,我設置了NSPersistentStoreCoordinator - 並且您需要添加一些選項來告訴它處理自動遷移:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:

[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,

[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

NSError *error;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    // Handle error
    NSLog(@"Problem with PersistentStoreCoordinator: %@",error);
}

那麼你需要在xCode中做一些小技巧:

  1. 選擇你的xcdatamodel文件
  2. 選擇頂部的設計菜單 - 然後選擇數據模型 - 然後選擇添加模型版本
  3. 然後,您的xcdatamodel文件將移動到與xcdatamodel文件具有相同名稱的新目錄中,但擴展名為xcdatamodeld - 此目錄中將有第二個文件,名稱中包含2。 選擇新文件,然後選擇設計 - >數據模型 - >設置當前版本( 在Xcode 4中,您可以這樣做
  4. 如果您已經做出導致您的項目不兼容的更改 - 請將這些更改從原始xcdatamodel文件中取出。 如果您尚未做出更改 - 那麼只需編輯2.xcdatamodel文件(您剛製作的最新版本)。
  5. 現在,當您將此版本安裝到具有舊型號的設備上時,它將自動將該型號升級到新型號。

這看起來很棒,並且盡可能簡單 - 但我認為在更改模型時您需要小心,否則您將不得不為每次更改創建一個新版本。

我認為我要做的是保留所有已更改的文件,然後一旦準備好部署我的更新,我將刪除所有中間文件,並部署最舊和最新的模型。

UPDATE(15/07/2011):

感謝@ rockstarberlin指出蘋果有更新的文檔:

Xcode 4:設置託管對像模型的當前版本

更新:8/19/2013更好的鏈接:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmModelFormat.html


為了跟進Santthosh的回答,我認為我會在這裡發布代碼片段。 你需要用initWithContentsOfURL:創建你的managedObjectModel initWithContentsOfURL:而不是mergedModelFromBundles:否則你會得到錯誤:

無法將模型與兩個不同的實體XXX和XXX合併

如果您的Model文件被命名為“Model”,那麼您可以創建managedObjectModel:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 

感謝這篇博文


這非常有幫助。 蘋果公司的文檔像往常一樣嚴重不完整。 我建議做一個乾淨的構建,因為我在進行這些更改後第一次運行時遇到錯誤“無法將模型與兩個不同的實體xxx合併”。 乾淨的構建固定它。





core-data