簡體   English   中英

iOS 7 - CoreData Migration - Xcode 5

[英]iOS 7 - CoreData Migration - Xcode 5

我在執行CoreData Migration時遇到了一個非常奇怪的問題。

基本上,我有2個實體,其中一個我添加一個屬性,另一個,我將屬性類型從NSString更改為NSArray(可轉換)。 到目前為止,它非常好,運行良好,在遷移后進行了測試並且數據完整性完好無損。

如果我在Xcode 5上運行完全相同的代碼(我不知道它是否與iOS SDK 7.0或Xcode 5相關),則會出現問題,但遷移會運行並破壞數據。

我最終創建了一個簡單的項目來演示正在發生的事情。 https://dl.dropboxusercontent.com/u/1393279/CoreDataMigration.zip

重現的步驟是: - 在Xcode 5(iOS SDK 7.0)上,您可以使用模擬器 -

1 - 打開項目“BeforeMigration”並執行。 查看創建的日志和數據,到目前為止沒問題;

2 - 停止項目;

3 - 打開項目“AfterMigration”,構建並運行。

4 - 看到遷移已執行,但數據已損壞:

2013-11-13 12:22:29.778 CoreDataMigration [7223:70b] CoreData:錯誤:fetchRowForObjectID期間的異常: * - [NSKeyedUnarchiver initForReadingWithData:]:難以理解的存檔(0x43,0x32,0x0,0x0,0x0,0x0,0x0,0x0 )with userInfo of(null)2013-11-13 12:22:29.782 CoreDataMigration [7223:70b] 因未捕獲的異常'NSInvalidArgumentException'而終止應用程序,原因:' ** - [NSKeyedUnarchiver initForReadingWithData:]:難以理解的存檔(0x43,0x32,0x0,0x0,0x0,0x0,0x0,0x0)'

AFAIK,難以理解的存檔意味着CoreData上的數據損壞。

很難理解的是,之前的代碼完全相同,因此,如果它是一個邏輯問題,它應該發生在Xcode 4.5上。 我找了CoreData Diffs,但沒找到任何相關的東西。

如果有人知道可能是什么問題,我將不勝感激。 謝謝。

在iOS 7中,Core Data SQLite存儲的默認日記模式已更改為預寫日志(WAL)以提高可靠性,性能和並發性。

問題是我沒有使用核心數據移動-wal文件。 修復它的一種方法是刪除-wal使用:

NSDictionary *options = @{NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}};

或者移動-wal:

- (NSPersistentStore *)migratePersistentStore:(NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)error

嘗試使用moGenerator 鏈接並嘗試以下步驟:

  • 使用MOGen(或MOGenerator)從每個構建模型中自動生成核心數據模型實體類(使用專用的預構建目標);
  • 始終在創建新數據模型時啟用模型版本控制;
  • 在創建數據模型的新版本時:

    1. 添加新的數據模型版本 - 稱之為“新版本”; 將其核心數據模型標識符設置為下一個所需版本(如:1.1或2.0等)。 這是模型版本的邏輯開發人員友好標識符 - 它不會強制Core Data以不同方式處理此版本,除非對其進行重要更改;

    2. 通過將其版本標識符附加到名稱來重命名以前的模型版本。 例如,如果將“版本標識符”設置為1.1的“MyDataModel.xcdatamodel” - 將其重命名為“MyDataModel_1.1.xcdatamodel”;

    3. 將新添加的版本重命名為簡單的模型名稱,如“MyDataModel.xcdatamodel”,並將其設置為當前版本。 這樣你總是保持當前模型版本的名稱相同,並且你的MOGen的激活/構建腳本不會改變(如果你使用MOGen - 你應該這樣做);

    4. 根據需要修改當前模型;

    5. 根據對模型所做更改的規模,Core Data Lightweight Migration功能可以按原樣處理。 如果更改是誇張的,您可能需要定義自己的映射模型,以幫助Core Data將舊數據存儲遷移到模型的最新版本中;

    6. 清潔您的產品;

    7. 重建您的產品;

    8. 測試一下。

Andrey Kornich的最佳實踐

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM