gpt4 book ai didi

ios - 核心数据迁移示例

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:03:51 24 4
gpt4 key购买 nike

我已经阅读了名为 Core Data Model Versioning and Data Migration Programming Guide 的文档.但是我在这方面仍然没有很多技能。所以我想发布一个我遇到的例子。

我有两个实体 RuleInstanceRule 有一个名为identifier 的属性。Instance 还有一个名为 identifier 的属性。

每个 Rule 都有一个唯一的标识符,每个实例都有一个与 Rules 相同的identifier。它就像是 RuleInstance 之间的一对多关系(它应该是)。

在我的新版本数据模型中,我想在RuleInstance 之间建立一对多关系,我该如何迁移?

最佳答案

我想通了。首先,在创建持久存储协调器时设置这些选项:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
nil];

if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType

configuration:nil URL:storeURL options:options error:&error])
{
//other code handle error
}

使用 Xcode 创建映射模型,设置其源版本和目标版本。

创建一个NSEntityMigrationPolicy的子类,命名为MyPolicy,覆盖方法。

-(BOOL)createRelationshipsForDestinationInstance:(NSManagedObject *)dInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error

调用此方法时,所有受管对象都已在目标上下文中创建,但它们之间的关系还没有。在这个方法中,检查dInstance是什么实体,并为它建立关系。

使用 Xcode,在您的映射模型中,将名为 InstanceToInstance 的映射策略设置为 MyPolicy

此方法将针对每个实例对象调用一次。对于我的问题,我应该这样做:

-(BOOL)createRelationshipsForDestinationInstance:(NSManagedObject *)dInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error{
NSError *superError = nil;
BOOL mappingSuccess = [super createRelationshipsForDestinationInstance:dInstance entityMapping:mapping manager:manager error:&superError];
if ([dInstance.entity.name isEqualToString:@"Rule"]){
Instance *instance = (Instance*)dInstance;
NSFetchRequest *fetch = [[NSFetchRequest alloc] initWithEntityName:@"Instance"];
fetch.predicate = [NSPredicate predicateWithFormat:@"identifier == %@",instance.identifier];
NSArray *result = [manager.destinationContext executeFetchRequest:fetch];
Rule *rule = [result objectAtIndex:0];
instance.rule = rule;
}
return YES;
}

然后,规则和实例之间的关系将在应用启动时创建。

另请注意,NSEntityMigrationPolicy的子类创建的关系不需要在xcode的迁移策略编辑窗口中设置值表达式,留空即可。

关于ios - 核心数据迁移示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13910861/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com