核心数据丢失的关系应用程序后,升级
我有一个棘手的问题,我无法找到答案。我的数据模型的结构是这样的:核心数据丢失的关系应用程序后,升级
版本1:
项目有许多地方
位置都有很多项目
但由于失误而两者之间的逆从未设置过。
版本2:
与上面相同,但现在设置为反向。
我的问题的一个例子如下:
在版本1中,我有两个项目拥有相同的位置。当我启动第2版和我的映射模型被处理,原计划将自己的位置失去它的那个位置关系,现在所在的位置显示时,只有这些项目,而不是他们两个中的一个组成部分。
我承认,这个问题可能是由我不设立项目和位置之间的反比关系引起的,但有什么我可以做,使整个应用程序/数据模型的两个版本的数据仍然存在?
编辑︰ 我已经尝试推断的映射模型,我已经尝试手动创建映射模型。我目前只使用NSMigratePersistentStoresAutomaticallyOption
键时,我创造了我NSPersistentStoreCoordinator
。
而且,仅仅是明确的,我有我的数据模型的两个版本,并移植成功发生,唯一的问题是,随着预期的关系并不持久。
编辑2: 我已经想通了,我需要继承NSEntityMigrationPolicy。我不想进行完全自定义的迁移,如果可能,我宁愿自动保留剩余的迁移。有没有人知道任何好的教程或NSEntityMigrationPolicy子类的例子,这将与我的目的有关?我一直无法找到很多,据我所知,在苹果文档中极少提及它。
编辑3: 我不能为我的生活弄清楚如何使用NSEntityMigrationPolicy设置反比关系。我的问题现在比前面描述的有点不同。有没有人知道如何做到这一点的任何可靠的例子?
对于其他任何人遇到这种情况,实际上是一个非常简单的答案,我还没有求索红。
我没有太过努力尝试子类NSEntityMigrationPolicy
- 我找不到任何超出基本范围的示例代码。在某些情况下,子类NSEntityMigrationPolicy
可能是最好的解决方案。但是如果你和我的情况一样 - (意思是你已经在你的模型中设置了反向关系的正确字段,但你忘记了实际指定反向),我相信我有一个更简单的解决方案。
相反子类NSEntityMigrationPolicy
的,我做了以下(实际上是简单得多IMO):
(记住,我的模型的设置如下:项目< - >位置,一有 - 和 - 属于多对的关系)
-
我在我的应用程序中保留了我的旧数据模型(.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]; } }
我救了我的
NSManagedObjectContext
。然后,我摆脱了我的
NSManagedObjectContext
,NSManagedObjectModel
,NSPersistentStoreCoordinator
并使用我的新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
}
是的,我设置了一个新的模型版本。升级是成功的,但关系失去了。我会尝试自动迁移,谢谢你的提示。 –
没有推测的映射模型的运气,它具有与我手动创建的映射模型相同的结果(这是有道理的 - 似乎推断的映射模型只是强制捆绑中的不同模型,直到它找到一对适合)。 –
您的第二个模型意外地将关系从'一对多'改变了吗?
如果是这样,那么当您的迁移从旧模型转换为新模型时,您的迁移可能只会将其分配给一个项目。
(这是猜测!)
不,谢谢你的猜测。 –
倒霉。
你将不得不通过继承NSEntityMigrationPolicy :(
采取documentation here的读手动迁移 - 特别是关于自定义实体移民政策的部分
你必须创建自己的反比关系作为迁移的一部分。
小号
是的,我在今天早上的文档中看到了这一点,但实际上我没有找到一个很好的例子来说明如何去做。我不想手动迁移一切,我相信我可以迁移某些实体。 –
大阅读!!!!! – RJR
“我的映射模型被处理” - >把你的模型映射到这里的代码。 – Nekto