iPhone核心数据“自动轻量级迁移”

我正在尝试更新实现核心数据存储的应用程序。 我正在为其中一个实体添加一个属性。

我将下面的代码添加到我的委托类:

- (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; } 

这是来自以下url: Doc

执行代码时出现以下错误:

2009-12-01 20:04:22.877

Shoppee [25633:207]错误:错误

域= NSCocoaErrorDomain代码= 134130

UserInfo = 0x1624d20“无法完成操作(Cocoa错误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”; }; 原因=“无法find源存储模型”; }

它看起来像我需要包括原始的数据模型,但我不知道如何做到这一点。 有什么build议么?

回顾/完整指南:

  1. 在做任何改变之前,创build一个新的模型版本。

    在Xcode 4中:select你的.xcdatamodel – >编辑器 – >添加模型版本。

    在Xcode 3中:devise – >数据模型 – >添加模型版本。

    您会看到.xcdatamodeld文件夹中创build了一个新的.xcdatamodeld文件夹(如果没有,也会创build该文件夹)

  2. 保存。

  3. select新的.xcdatamodel并根据轻量级迁移文档进行希望使用的更改。

  4. 保存。

  5. 将当前/活动模式设置为新创build的模式。

    select了.xcdatamodeld文件夹:

    在Xcode 4:工具侧边栏 – >文件检查器 – >版本化的核心数据模型 – >select新的模式。

    在Xcode 3中:devise>数据模型>设置当前版本。

    .xcdatamodel图标上的绿色勾号将移动到新的模式。

  6. 保存。

  7. 实现必要的代码以在运行时执行迁移。

    在创buildNSPersistentStoreCoordinator (通常是AppDelegate类)的情况下,对于options参数,将nilreplace为以下代码:

     [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil] 
  8. 运行你的应用程序 如果没有崩溃,你可能已经成功迁移:)

  9. 成功迁移后,可以删除迁移代码(第7步)。 (由开发人员决定何时发布的应用程序的用户可以被视为已经迁移。)

重要:不要删除旧的模型版本/模式。 核心数据需要旧版本迁移到新版本。

我想到了。

devise>数据模型>添加模型版本

对于Google员工来说,这就是你需要做的事情(假设你已经设置了轻量级迁移):

  1. 在进行更改之前,请执行devise – >数据模型 – >添加模型版本(您将看到在.xcdatamodeld文件夹中创build了一个新的.xcdatamodel
  2. 保存
  3. 做你的改变
  4. 保存
  5. 运行应用程序

第一步对于这项工作至关重要。 我遇到了这个问题,因为我已经按照这些步骤来添加一个新的领域。 这工作。 我添加了第二个新的领域,但忘了“添加模型版本”,东西炸毁了。

也为googlers ..简单的规则,永远不要删除/编辑任何旧的编号版本。 当您添加模型版本时,数字后缀将增加为2..3..4,意思是2是最早的3个下一个等等,但当前要编辑的是未编号的版本。

不要删除旧的模型版本,因为具有以前的数据库的用户使用旧的模型版本将无法迁移到最新的数据库模型,无需比较旧的和最新的模式。

对于那些遇到这个谷歌search的人来说,看起来即使有了自动(魔术)迁移,你仍然需要创build一个原始商店和一个新的版本,并将新版本设置为当前版本。

到目前为止,我只看到如何避免错误信息。

但是,我们如何解决这个问题 – 万一我们已经搞砸了?

以下解决scheme解决了这个问题,但是您将丢失数据库中的数据:

删除/重命名部署/安装的应用程序的sqlite文件
错误消息后直接给出位置的文件名称。 例如:

原因=无法find源存储模型},{
URL =“file://localhost/Users/yourName/Library/Application%20Support/iPhone%20Simulator/4.3/Applications/62F342D4-F007-4F6F-96D2-68F902D3719A/Documents/Locations.sqlite”;

做一个轻量级迁移时要记住一些事情 –

如果您打算重命名/修改属性,请记住在新模型或旧模型中设置“重命名ID”值。 要使用Apple自己的示例,在XCode 4.3中,在新模型中selectpaintColor>切换到数据模型检查器>在“版本控制”部分将“重命名标识”字段设置为颜色。 对我而言,如果不这样做,就会导致运行时错误。 这同样的错误也包括在这里 。 作为一个新用户,我不允许发布图片,所以这里是一个imgur链接 (真的不是垃圾邮件)。

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

在对数据模型进行更改并在具有不同版本的sqlite文件的已安装应用程序上运行时,也可能会出现此错误。 在这种情况下,只需删除已安装的应用程序并重新运行它。

以防万一有人遇到这种情况,并没有上述工作…我是从模拟器删除我的应用程序,清理等,但没有任何工作。 我不得不去模拟器目录,并手动rm的.sqlite文件,让应用程序再次工作。 没有线索…