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




core-data core-data-migration (6)

概述/完整指南:

  1. 在進行任何更改之前,請創建新的模型版本。

    在Xcode 4中:選擇.xcdatamodel - > Editor - > Add Model Version。

    在Xcode 3中:設計 - >數據模型 - >添加模型版本。

    您將看到在.xcdatamodeld文件夾中創建了一個新的.xcdatamodel (如果沒有,也會創建該文件夾)

  2. 保存。

  3. 選擇新的.xcdatamodel並根據Lightweight Migration文檔進行您希望使用的更改。

  4. 保存。

  5. 將當前/活動架構設置為新創建的架構。

    選擇.xcdatamodeld文件夾:

    在Xcode 4:Utilities側欄 - > File Inspector - > Versioned Core Data Model - >選擇新架構。

    在Xcode 3中:設計>數據模型>設置當前版本。

    .xcdatamodel圖標上的綠色勾號將移至新架構。

  6. 保存。

  7. 實現必要的代碼以在運行時執行遷移。

    在創建NSPersistentStoreCoordinator地方(通常是AppDelegate類),對於options參數,使用以下代碼替換nil

    [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                      [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
    
  8. 運行你的應用程序 如果沒有崩潰,你可能已成功遷移:)

  9. 成功遷移後,可以刪除遷移代碼(步驟7)。 (由開發人員決定何時可以認為已發布的應用程序的用戶已遷移。)

重要信息:請勿刪除舊版本的模型/模式。 Core Data需要將舊版本遷移到新版本。

https://code.i-harness.com

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

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

- (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 =“找不到源存儲的模型”; }

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


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


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


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

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

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

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

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


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