在核心数据模型中进行一些更改后转储

时间:2010-09-30 09:08:25

标签: core-data store

我在CoreData模型上做了一些更改。到目前为止,我添加了一个名为“语言”的属性。启动我的应用程序后,单击“创建新客户”,将创建一个实例变量Customer。此变量由以下内容创建:

Customer *newCustomer = [NSEntityDescription insertNewObjectForEntityForName:@"Customer" inManagedObjectContext:appDelegate.managedObjectContext];

在我做这些改变之前,一切都按计划进行。但是现在我收到一个包含此错误消息的转储:reason = "The model used to open the store is incompatible with the one used to create the store";

我该怎么做才能解决这个问题?到目前为止,重置持久性存储并没有帮助。

2 个答案:

答案 0 :(得分:2)

我解决这个问题的方法是添加这个

  

[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];

在添加持久性存储之前,

到persistentStoreCoordinator中的appDelegate。这将删除不再与您的数据模型兼容的现有商店。如果要保留存储的内容,请记住在下次运行应用程序之前对此行进行注释。

当我必须删除旧商店时,我的persistentStoreCoordinator实现看起来像这样。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator_ != nil) {
    return persistentStoreCoordinator_;
}
NSError *error = nil;
NSURL *storeURL = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MyPinballScore.sqlite"]];
//The following line removes your current store so that you can create a new one that is compatible with your new model
[[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil];

persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
}    

return persistentStoreCoordinator_;

}

答案 1 :(得分:0)

答案有点棘手,但这对我来说总是有用。这是为了干净安装新兼容的.sqlite文件,不是迁移

启动模拟器,删除应用和数据(删除应用后弹出窗口)。

退出模拟器

在对数据模型进行任何编辑后打开X-Code

删除{*appname*}.sqlite文件(或备份它,将其从项目文件夹中删除,然后删除引用)

清理应用(Product > Clean

在模拟器中运行应用程序(对于本教程,我将假设4.2)

在模拟器运行时,在Finder窗口中,导航至: {*home*} > Library > Application Support > iPhone Simulator > 4.2 > Applications > {*random identifier*} > Documents > {*appname*}.sqlite

将此文件复制到其他位置

停止在X-Code中运行您的应用

将{ appname }。sqlite文件拖放到X-Code中的文件列表中。

在弹出的对话框中,确保选中copy to folder复选框。

Product > Clean

然后再次在模拟器中运行应用程序

现在你应该有一个工作的sqlite文件!

干杯, 罗伯特