核心数据迁移失败并出现错误:第一次迁移后无法保存新存储

发布于 2024-08-31 00:40:05 字数 2762 浏览 3 评论 0原文

过去,我已经成功实现了从数据模型版本 1 到版本 2 的自动迁移。现在,使用 SDK 3.1.3,从版本 2 迁移到版本 3 失败,并出现以下错误:

未解决的错误 Error Domain= NSCocoaErrorDomain Code=134110 UserInfo=0x5363360“操作无法完成。(Cocoa 错误 134110。)”,{ NSUnderlyingError =错误域=NSCocoaErrorDomain代码=256 UserInfo=0x53622b0“操作无法完成。(Cocoa错误256。)”; Reason =“第一次迁移后无法保存新存储。”; }

我尝试过使用 NSMigratePersistentStoresAutomaticallyOptionNSInferMappingModelAutomaticallyOption 进行自动迁移,也尝试过仅使用 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。有什么线索吗?我做错了什么吗? 先感谢您。

In the past I had already implemented successfully automatic migration from version 1 of my data model to version 2. Now, using SDK 3.1.3, migrating from version 2 to version 3 fails with the following error:

Unresolved error Error Domain=NSCocoaErrorDomain Code=134110 UserInfo=0x5363360 "Operation could not be completed. (Cocoa error 134110.)", {
NSUnderlyingError = Error Domain=NSCocoaErrorDomain Code=256 UserInfo=0x53622b0 "Operation could not be completed. (Cocoa error 256.)";
reason = "Failed to save new store after first pass of migration.";
}

I have tried automatic migration using NSMigratePersistentStoresAutomaticallyOption and NSInferMappingModelAutomaticallyOption and also migration using only NSMigratePersistentStoresAutomaticallyOption, providing a mapping model from v2 to v3.

I see the above error logged, and no object is available in the application. However, if I quit the application and reopen it, everything is in place and working.

The Core Data methods I am using are the following ones

- (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;

}

In the simulator, I see that this generates a MYAPP~.sqlite files and a MYAPP.sqlite file. I tried to remove the MYAPP~.sqlite file, but

BOOL oldExists = [[NSFileManager defaultManager] fileExistsAtPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MYAPP~.sqlite"]];

always returns NO. Any clue? Am I doing something wrong?
Thank you in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

对岸观火 2024-09-07 00:40:05

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

I ran into this as well and after reading as much Apple docs and web postings as I could find there didn't seem to be an answer. In my case the manual migration was working as well but when I went to open up a new coordinator it would give the same error you had. I finally decided to go back to my last working version of the data model and do a series of small changes/versions and see where it broke the auto-migration capabilities to drill further into it and it turned out it didn't. Now I can add entities, attributes and relationships without issue and they auto-migrate. Any chance you deleted an interim version of the datamodel?

怀中猫帐中妖 2024-09-07 00:40:05

就其价值而言,Magical Record Core Data 实用程序包包含此技巧:

[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];
}

您可以尝试类似的方法。不过,我一直无法找到问题所在的解释,或者为什么重试会起作用。

For what it's worth, the Magical Record Core Data utility package includes this 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];
}

You might try something similar. I have been unable to find an explanation of what the problem is, though, or why just retrying it would work.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文