ios iPhone核心數據“自動輕量級遷移”




core-data core-data-migration (8)

我正在嘗試更新實現核心數據存儲的應用程序。 我正在為其中一個實體添加一個屬性。

我將以下代碼添加到我的委託類:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Shoppee.sqlite"]];

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

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

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
        NSLog(@"Error: %@",error);
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return persistentStoreCoordinator;
}

這來自以下網址: Doc

執行代碼時出現以下錯誤:

2009-12-01 20:04:22.877

Shoppee [25633:207]錯誤:錯誤

Domain = NSCocoaErrorDomain Code = 134130

UserInfo = 0x1624d20“操作無法完成。(可可錯誤134130.)”2009-12-01 20:04:22.879 Shoppee [25633:207]未解決的錯誤錯誤域= NSCocoaErrorDomain代碼= 134130 UserInfo = 0x1624d20“操作無法執行已完成。(Cocoa error 134130.)“,{URL = file:// localhost / Users / Eric / Library / Application%20Support / iPhone%20Simulator / User / Applications / A8A8FB73-9AB9-4EB7-8F83-82F5B4467AF1 / Documents / MyApp .sqlite; metadata = {NSPersistenceFrameworkVersion = 241; NSStoreModelVersionHashes = {Item = <869d4b20 088e5c44 5c345006 87d245cd 67ab9bc4 14cadf45 180251e9 f741a98f>; Store = <47c250f4 895e6fd1 5033ab42 22d2d493 7819ba75 3c0acffc 2dc54515 8deeed7a>; }; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers =(); NSStoreType = SQLite; NSStoreUUID =“8DC65301-3BC5-42BE-80B8-E44577B8F8E1”; }; reason =“找不到源存儲的模型”; }

看起來我需要包含原始數據模型,但我不知道該怎麼做。 有什麼建議麼?


在進行輕量級遷移時要記住一些事項 -

如果您計劃重命名/修改屬性,請記住在新模型或舊模型中設置“重命名ID”值。 要使用Apple自己的示例,請在XCode 4.3中,在新模型中選擇paintColor>切換到數據模型檢查器>在“版本控制”部分中將“重命名ID”字段設置為“顏色”。 對我來說,未執行此步驟會導致運行時錯誤。 這裡涉及同樣的錯誤。 作為一個新用戶,我不允許發布圖片,所以這裡有一個imgur鏈接 (不是垃圾郵件,真的)。

    (Cocoa error 134140.)" UserInfo=0x622b350 {reason=Can't find or automatically infer mapping model for migration

在更改數據模型並在具有不同版本的sqlite文件的已安裝應用程序上運行時,也會出現此錯誤。 在這種情況下,只需刪除已安裝的應用程序並重新運行它。


以防萬一有人遇到這種情況而上述情況都沒有...我正在從模擬器中刪除我的應用程序,清理等,但沒有任何方法可行。 我不得不去模擬器目錄並手動運行.sqlite文件以使應用程序再次運行。 沒有線索...


對於googlers ..簡單的規則,永遠不要刪除/編輯任何舊的編號版本。 當您添加模型版本時,數字後綴將增加為2..3..4意味著2是最舊的3下一個等等。但是要編輯的當前編號是未編號的版本。

不要刪除舊的模型版本,因為使用舊模型版本的先前數據庫的用戶將無法在不比較舊模式和最新模式的情況下遷移到最新的數據庫模型。


到目前為止,我只看到如何避免錯誤消息。

但是我們如何解決它 - 以防我們已經搞砸了?

以下解決方案解決了問題,但您將丟失數據庫中的數據:

刪除/重命名已部署/已安裝應用程序的sqlite文件
在錯誤消息之後直接給出文件名稱的位置。 例如:

reason =找不到源存儲的模型},{
URL =“file://localhost/Users/yourName/Library/Application%20Support/iPhone%20Simulator/4.3/Applications/62F342D4-F007-4F6F-96D2-68F902D3719A/Documents/Locations.sqlite”;


我想到了。

設計>數據模型>添加模型版本


對於Google員工,這是您需要做的(假設您已經設置了輕量級遷移):

  1. 在進行更改之前,請執行設計 - >數據模型 - >添加模型版本(您將看到在.xcdatamodeld文件夾中創建了新的.xcdatamodel
  2. 保存
  3. 做出改變
  4. 保存
  5. 運行App

步驟#1對於完成這項工作至關重要。 我遇到了這個問題,因為我按照這些步驟添加了一個新字段。 那很有效。 我添加了第二個新字段,但忘了“添加模型版本”,事情爆炸了。


對於那些遇到這個谷歌搜索的人來說,似乎即使使用自動(魔術)遷移,您仍然需要創建原始商店的版本和新版本,並將新版本設置為當前版本。