核心数据丢失的关系应用程序后,升级

问题描述:

我有一个棘手的问题,我无法找到答案。我的数据模型的结构是这样的:核心数据丢失的关系应用程序后,升级

版本1:
项目有许多地方
位置都有很多项目
但由于失误而两者之间的逆从未设置过。

版本2:
与上面相同,但现在设置为反向。

我的问题的一个例子如下:
在版本1中,我有两个项目拥有相同的位置。当我启动第2版和我的映射模型被处理,原计划将自己的位置失去它的那个位置关系,现在所在的位置显示时,只有这些项目,而不是他们两个中的一个组成部分。

我承认,这个问题可能是由我不设立项目和位置之间的反比关系引起的,但有什么我可以做,使整个应用程序/数据模型的两个版本的数据仍然存在?

编辑︰ 我已经尝试推断的映射模型,我已经尝试手动创建映射模型。我目前只使用NSMigratePersistentStoresAutomaticallyOption键时,我创造了我NSPersistentStoreCoordinator

而且,仅仅是明确的,我有我的数据模型的两个版本,并移植成功发生,唯一的问题是,随着预期的关系并不持久。

编辑2: 我已经想通了,我需要继承NSEntityMigrationPolicy。我不想进行完全自定义的迁移,如果可能,我宁愿自动保留剩余的迁移。有没有人知道任何好的教程或NSEntityMigrationPolicy子类的例子,这将与我的目的有关?我一直无法找到很多,据我所知,在苹果文档中极少提及它。

编辑3: 我不能为我的生活弄清楚如何使用NSEntityMigrationPolicy设置反比关系。我的问题现在比前面描述的有点不同。有没有人知道如何做到这一点的任何可靠的例子?

+0

“我的映射模型被处理” - >把你的模型映射到这里的代码。 – Nekto

对于其他任何人遇到这种情况,实际上是一个非常简单的答案,我还没有求索红。

我没有太过努力尝试子类NSEntityMigrationPolicy - 我找不到任何超出基本范围的示例代码。在某些情况下,子类NSEntityMigrationPolicy可能是最好的解决方案。但是如果你和我的情况一样 - (意思是你已经在你的模型中设置了反向关系的正确字段,但你忘记了实际指定反向),我相信我有一个更简单的解决方案。

相反子类NSEntityMigrationPolicy的,我做了以下(实际上是简单得多IMO):

(记住,我的模型的设置如下:项目< - >位置,一有 - 和 - 属于多对的关系)

  1. 我在我的应用程序中保留了我的旧数据模型(.xcdatamodel)文件。当我的应用第一次加载时,它会从旧的数据模型文件加载我的NSManagedObjectModel。然后,我开始循环遍历数据库中的所有项目,并遍历每个项目的所有位置,并为每个位置手动设置“项目”字段 - 如果我第一次将模型设置为正确,这将使用反向关系自动完成。这里是我的代码如下所示:

    NSArray *projects = [context executeFetchRequest:request error:&error]; 
    for(Project *project in projects) { 
        for(Location *location in project.locations) { 
         // set the inverse relationship manually 
         [location addProjectsObject:project]; 
        } 
    } 
    
  2. 我救了我的NSManagedObjectContext

  3. 然后,我摆脱了我的NSManagedObjectContextNSManagedObjectModelNSPersistentStoreCoordinator并使用我的新xcdatamodel文件重建它们。新的模型文件包含相反的关系,并且他们正确设置。从SQLite数据库迁移数据时,所有数据都保持不变,而我手动设置的相反关系仍然存在。在创建新的NSPersistentStoreCoordinator时,请确保指定NSMigratePersistentStoresAutomaticallyOption选项。

使用自动迁移模型设置你的持久存储协调,看看是否可行。另外,你确实创建了一个新的模型版本,对吧?如果没有适当的模型,核心数据就无法映射。

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 
    } 
+0

是的,我设置了一个新的模型版本。升级是成功的,但关系失去了。我会尝试自动迁移,谢谢你的提示。 –

+0

没有推测的映射模型的运气,它具有与我手动创建的映射模型相同的结果(这是有道理的 - 似乎推断的映射模型只是强制捆绑中的不同模型,直到它找到一对适合)。 –

您的第二个模型意外地将关系从'一对多'改变了吗?

如果是这样,那么当您的迁移从旧模型转换为新模型时,您的迁移可能只会将其分配给一个项目。

(这是猜测!)

+0

不,谢谢你的猜测。 –

倒霉。

你将不得不通过继承NSEntityMigrationPolicy :(

采取documentation here的读手动迁移 - 特别是关于自定义实体移民政策的部分

你必须创建自己的反比关系作为迁移的一部分。

小号

+0

是的,我在今天早上的文档中看到了这一点,但实际上我没有找到一个很好的例子来说明如何去做。我不想手动迁移一切,我相信我可以迁移某些实体。 –

+0

大阅读!!!!! – RJR