4

在过去,我已经成功地实现了从我的数据模型版本 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。有什么线索吗?难道我做错了什么?先感谢您。

4

2 回答 2

1

值得一提的是,Magical Record Core Data 实用程序包包含以下 hack:

[coordinator MR_addAutoMigratingSqliteStoreNamed:storeFileName];

//HACK: lame solution to fix automigration error "Migration failed after first pass"
if ([[coordinator persistentStores] count] == 0) 
{
    [coordinator performSelector:@selector(MR_addAutoMigratingSqliteStoreNamed:) withObject:storeFileName afterDelay:0.5];
}

你可能会尝试类似的东西。但是,我一直无法找到问题所在的解释,或者为什么重试它会起作用。

于 2013-06-17T19:42:30.390 回答
1

我也遇到了这个问题,在阅读了尽可能多的 Apple 文档和网络帖子后,我发现似乎没有答案。就我而言,手动迁移也可以正常工作,但是当我去打开一个新的协调器时,它会给出与您相同的错误。我最终决定回到我上一个工作版本的数据模型并进行一系列小的更改/版本,看看它在哪里破坏了自动迁移功能以进一步深入研究它,结果证明它没有。现在我可以毫无问题地添加实体、属性和关系,并且它们会自动迁移。您是否有机会删除了数据模型的临时版本?

于 2010-04-29T23:50:00.863 回答