gpt4 book ai didi

objective-c - 核心数据版本控制和使用自定义策略迁移

转载 作者:可可西里 更新时间:2023-11-01 04:23:03 27 4
gpt4 key购买 nike

我发现文档非常有限,而且找不到我的问题解决方案。

我需要添加新实体(与现有实体有关系)。同时添加和重命名现有实体的一些属性。

轻量级示例:

旧模型有一个实体 Item 和一个属性 name

在新模型中,我希望Item 有一个新属性dateAdded 并将name 重命名为title。此时,如果 dateAdded 是可选的或给定默认值,我可以使用轻量级迁移功能。如果我错了,请纠正我。

但我还想添加具有 title 属性的新 List 实体。并添加一对多关系。列表可以为空或有很多项目。项目必须仅引用一个列表。

所以我很困惑我必须做什么以及顺序是什么。

  1. 启用迁移并禁用轻量级迁移功能(NSDictionary* options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:NO], NSInferMappingModelAutomaticallyOption, nil];).

  2. 创建新版本的模型。在那里我做我想做的改变。

  3. 创建一个新的映射模型。源是旧模型,目标是新模型。在 ItemToItem 中,我将 title 设置为 $source.name

此外,Xcode 在使用映射模型时仍然崩溃,我不知道下一步该怎么做。我想我必须在上下文中创建一个 List 实例,并根据关系策略使所有项目都引用它。我认为我应该使用自定义 NSEntityMigrationPolicy 来执行此操作。对完成这个挑战有什么帮助吗?

最佳答案

好吧,我做到了......

我的前 3 个步骤是正确的。继续场景:

添加 4。执行 ItemToItemMigrationPolicyNSEntityMigrationPolicy 的子类。覆盖:

- (BOOL)beginEntityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
List* list = (List*)[NSEntityDescription insertNewObjectForEntityForName:@"List" inManagedObjectContext:[manager destinationContext]];
list.name = @"Default list";

return YES;
}

- (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error
{
Item* item = (Item*)[NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]];
item.dateAdded = [NSDate date];
task.title = [sInstance valueForKey:@"name"];

[manager associateSourceInstance:sInstance withDestinationInstance:item forEntityMapping:mapping];

return YES;
}

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

NSFetchRequest* fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"List"];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name LIKE 'Default list'"];
fetchRequest.predicate = predicate;

NSError* fetchRequestError = nil;
NSArray* listsArray = [manager.destinationContext executeFetchRequest:fetchRequest error:&fetchRequestError];
if (fetchRequestError) {
NSLog(@"%@", fetchRequestError.localizedDescription);
}
List* list = [listsArray lastObject];

((Item*)dInstance).list = list;

return YES;
}

添加5。在 Xcode 的映射模型中,使用 ItemToItemMigrationPolicy 值将 ItemToItem 迁移策略设置为自定义。

添加 6。使您的新模型版本成为最新版本,并从新的或更改的实体生成(替换)类。

添加7。更改您的代码,例如 item.name 不再有效。现在是 item.title。清理项目并运行。

关于objective-c - 核心数据版本控制和使用自定义策略迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7027108/

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