我正在尝试进行自定义 coredata 迁移。
在旧数据模型中,我有一个带有状态字段的联系人表。现在,如果状态 == 2,我希望为联系人表中的每条记录创建另一个表 -“推荐”。推荐表中的属性与联系人表中的属性完全不同。
什么是这样做的好方法。
从我读到的,似乎我应该使用自定义 coredata 迁移策略并覆盖
- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject*)src ¬
entityMapping:(NSEntityMapping*)map manager:(NSMigrationManager*)mgr error:(NSError**)error
但是实现我想做的事情似乎太复杂了。目前我的数据模型版本为 15。我是否需要为从 1 到 14 的所有先前模型版本创建映射模型?如果我下次有版本 20 并且用户直接从版本 10 更新到版本 20,是否也会触发此迁移策略?如果出现任何问题,很难测试会发生什么。
我尝试了另一种方法 - 当我初始化 storecoordinator 时,我使用:
NSManagedObjectModel *destinationModel = [self managedObjectModel];
// Migration is needed if destinationModel is NOT compatible
BOOL isMigrationNeeded = ![destinationModel isConfiguration:nil
compatibleWithStoreMetadata:sourceMetadata];
if (isMigrationNeeded) {
self.needMigration = YES;
DDLogInfo(@"Migration needed");
NSArray* sourceVersionIdentifiers = [sourceMetadata objectForKey:NSStoreModelVersionIdentifiersKey];
self.sourceMigrationVersion = [sourceVersionIdentifiers lastObject];
DDLogInfo(@"Source Version:%@",self.sourceMigrationVersion);
NSSet* destVersionIdentifiers = [destinationModel versionIdentifiers];
self.destMigrationVersion = [destVersionIdentifiers anyObject];
DDLogInfo(@"Destination Version:%@",self.destMigrationVersion);
}
- (NSDictionary *)sourceMetadata:(NSError **)error
{
return [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:NSSQLiteStoreType
URL:[self storeURL]
error:error];
}
基本上,我尝试比较旧模型和新模型的数据模型版本,并在其他地方运行一些自定义代码,如果我检测到它正在迁移到某个版本。
问题是我的一些旧数据模型版本没有版本标识符。即使我现在添加它们,它也不会显示在源元数据中。我猜你必须在从模型创建商店时明确设置它?
另一种选择是忽略上述所有内容,并在执行迁移时设置并保存一个标志,并在每次启动时检查该标志。但这对我来说听起来不是很干净。
有什么想法吗?