过去,我已经成功实现了从数据模型版本 1 到版本 2 的自动迁移。现在,使用 SDK 3.1.3,从版本 2 迁移到版本 3 失败,并出现以下错误:
Unresolved 错误错误域=NSCocoaErrorDomain代码=134110 UserInfo=0x5363360“操作无法完成。(Cocoa错误134110。)”,{ NSUnderlyingError =错误域=NSCocoaErrorDomain代码=256 UserInfo=0x53622b0“操作无法完成。(Cocoa错误256。)”; Reason =“第一次迁移后无法保存新存储。”; }
我尝试过使用 NSMigratePersistentStoresAutomaticallyOption
和 NSInferMappingModelAutomaticallyOption
进行自动迁移,也尝试过仅使用 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。有什么线索吗?难道我做错了什么? 预先感谢您。
最佳答案
我也遇到了这个问题,在阅读了尽可能多的苹果文档和网络帖子后,我发现似乎没有答案。就我而言,手动迁移也有效,但是当我打开一个新的协调器时,它会给出与您相同的错误。我最终决定回到数据模型的上一个工作版本,并进行一系列小的更改/版本,看看它在哪里破坏了自动迁移功能,以进一步深入研究它,结果证明它没有。现在我可以毫无问题地添加实体、属性和关系,并且它们会自动迁移。您是否有机会删除数据模型的临时版本?
关于iphone - 核心数据迁移失败,错误为 : Failed to save new store after first pass of migration,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2714226/