![](/img/trans.png)
[英]When to Use Custom Migration compared to Lightweight Migration in CoreData (iOS)
[英]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 鏈接並嘗試以下步驟:
在創建數據模型的新版本時:
添加新的數據模型版本 - 稱之為“新版本”; 將其核心數據模型標識符設置為下一個所需版本(如:1.1或2.0等)。 這是模型版本的邏輯開發人員友好標識符 - 它不會強制Core Data以不同方式處理此版本,除非對其進行重要更改;
通過將其版本標識符附加到名稱來重命名以前的模型版本。 例如,如果將“版本標識符”設置為1.1的“MyDataModel.xcdatamodel” - 將其重命名為“MyDataModel_1.1.xcdatamodel”;
將新添加的版本重命名為簡單的模型名稱,如“MyDataModel.xcdatamodel”,並將其設置為當前版本。 這樣你總是保持當前模型版本的名稱相同,並且你的MOGen的激活/構建腳本不會改變(如果你使用MOGen - 你應該這樣做);
根據需要修改當前模型;
根據對模型所做更改的規模,Core Data Lightweight Migration功能可以按原樣處理。 如果更改是誇張的,您可能需要定義自己的映射模型,以幫助Core Data將舊數據存儲遷移到模型的最新版本中;
清潔您的產品;
重建您的產品;
測試一下。
Andrey Kornich的最佳實踐
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.