报这个错误,说明你在运行这次程序时,更改了数据库中的表内容,比如更改了表属性,或者增加了一张表等。这个时候运行就会报这个错误。告诉你,用来创建数据库的模型和你用来打开数据库的模型是不相容的,也就是你动了这个model,动了数据库中表的内容。一般程序崩溃会在下面的函数崩溃:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator !=
nil) {
return
_persistentStoreCoordinator;
}
NSURL *storeURL = [[self
applicationDocumentsDirectory] URLByAppendingPathComponent:@"storeName"];
NSError *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. 如果你不是在更新app,只是在简单的跑应用,那么把程序卸载重装就能解决问题。
2. 如果你是在更新app,那这个时候就有点难办了。
1)如果不要求保存数据库里的数据的话,可以在上面的函数里面增加下面的代码:
if (![[NSUserDefaults
standardUserDefaults] boolForKey:@"isDeleteDB"]) {
[[NSFileManager
defaultManager] removeItemAtURL:storeURL
error:nil]; //删除数据库
[[NSUserDefaults
standardUserDefaults] setBool:YES
forKey:@"isDeleteDB"];
[[NSUserDefaults
standardUserDefaults] synchronize];
}
其中用userDefaults控制一下。
2)如果要保存数据库里的数据,那么就要做数据迁移了,即把原数据库中的数据迁移出来,保存,然后再写入新数据库中。