我在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";
我该怎么做才能解决这个问题?到目前为止,重置持久性存储并没有帮助。
答案 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文件!
干杯, 罗伯特