在过去,我已经成功地实现了从我的数据模型版本 1 到版本 2 的自动迁移。现在,使用 SDK 3.1.3,从版本 2 迁移到版本 3 失败并出现以下错误:
未解决的错误 Error Domain=NSCocoaErrorDomain Code=134110 UserInfo=0x5363360 "操作无法完成。(Cocoa 错误 134110.)", { NSUnderlyingError = Error Domain=NSCocoaErrorDomain Code=256 UserInfo=0x53622b0 "操作无法完成。(Cocoa 错误256.)"; reason = "第一次迁移后保存新存储失败。"; }
我已经尝试使用NSMigratePersistentStoresAutomaticallyOption
和进行自动迁移NSInferMappingModelAutomaticallyOption
,也尝试使用 only进行迁移NSMigratePersistentStoresAutomaticallyOption
,提供从 v2 到 v3 的映射模型。
我看到记录了上述错误,并且应用程序中没有可用的对象。但是,如果我退出应用程序并重新打开它,那么一切都已就绪并且可以正常工作。
我使用的核心数据方法如下
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
NSString *path = [[NSBundle mainBundle] pathForResource:@"MYAPP" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
return managedObjectModel;
}
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MYAPP.sqlite"]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Handle error
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
return persistentStoreCoordinator;
}
在模拟器中,我看到这会生成一个 MYAPP~.sqlite 文件和一个 MYAPP.sqlite 文件。我试图删除 MYAPP~.sqlite 文件,但是
BOOL oldExists = [[NSFileManager defaultManager] fileExistsAtPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MYAPP~.sqlite"]];
总是返回 NO。有什么线索吗?难道我做错了什么?先感谢您。