coredata在设备上使用旧文件版本

时间:2010-04-22 23:07:36

标签: iphone core-data nsmanagedobjectcontext

这是我以前的问题here的后续内容。重置模拟器之前解决了我所有的麻烦,我已经完成了我的应用程序。

我在iPhone设备上安装应用时遇到了同样的问题。它选择了我的数据库的旧版本,其中没有第二个实体,当我尝试访问第二个实体时崩溃:

2010-04-22 23:52:18.860 albumCloud[135:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'Image''
2010-04-22 23:52:18.874 albumCloud[135:207] Stack: (
  843263261,
  825818644,
  820669213,
  20277,
  844154820, 
  16985,   
  14633,   
  844473760,   
  844851728,   
  862896011,   
  843011267,   
  843009055,   
  860901832,   
  843738160,   
  843731504,   
  11547,   
  11500   
 )

terminate called after throwing an instance of 'NSException'

我有两个问题:

1)我如何从手机中彻底删除我的应用程序以删除旧数据? (到目前为止,我已尝试删除常规应用程序,删除然后保留主页和电源进行重启,在运行应用程序时诅咒并威胁应用程序......所有内容)

2)当我的应用程序在App Store中时,如何防止这种情况发生?我出于某种原因决定我要将另一个实体添加到商店,还是将其他属性添加到现有实体?是否存在“如果x不存在则创建它”方法?

1 个答案:

答案 0 :(得分:1)

要完全删除应用程序,请按常规方法删除它,即按住直到它摆动并点按删除按钮。然后连接到iTunes。可能是iTunes每次都在恢复应用程序及其备份数据。

要支持以后添加新实体,您需要使用版本控制和自动轻量级迁移,如下所述:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweight.html#//apple_ref/doc/uid/TP40008426-SW1

基本上,您使用Xcode中的Design->Data Model菜单项(Xcode 4中的Editor->“Add Model Version”)创建数据模型的新版本,然后进行一些代码更改。这将导致Core Data自动将旧模型迁移到较新模型。您可以进行哪些类型的更改。您可以添加新实体,并将可选属性添加到现有实体,或者将默认值设置为必需属性。

让我感到震惊的一件事是,当您想要使用版本控制和迁移时,加载核心数据NSManagedObjectModel的方式会发生变化。如果没有迁移,你可能会这样:

NSManagedObjectModel *model = [NSManagedObjectModel mergedModelFromBundles:nil];

开始使用版本控制和迁移后,需要将其更改为:

NSString *path = [[NSBundle bundleForClass:self.class] pathForResource:@"DataModelName"
                                                                ofType:@"momd"];
NSURL *url = [NSURL fileURLWithPath:path];
NSManagedObjectModel *model = [[[NSManagedObjectModel alloc] initWithContentsOfURL:url] autorelease];