gpt4 book ai didi

cocoa - NSManagedObjectModel 中合并模型的跨模型关系?

转载 作者:行者123 更新时间:2023-12-03 16:05:07 26 4
gpt4 key购买 nike

如果实体始终在通过合并相关模型创建的 NSManagedObjectModel 中使用,是否可以对单独 NSManagedObjectModel 中定义的实体之间的关系进行建模?

例如,假设模型 1 定义了一个具有(一对一)关系 toBar 的实体 Foo,而模型 2 定义了一个实体 Bar code> 与关系(一对一)toFoo。我将使用 -[NSManagedObjectModel mergedModelFromModels] 构建一个 CoreData 堆栈,合并模型 1 和模型 2。有没有办法在数据建模器中或以编程方式定义这些关系,以便它们的行为就像是模型内关系?

最佳答案

模型 1 和模型 2 都无法在运行时加载,除非它们格式良好,也就是说,除非 toBartoFoo 关系有目的地。此外,如果模型 1 和模型 2 具有相同名称的模型,您将无法从它们创建合并模型;它们不会合并,它们会碰撞,这是一个错误。

但是,您可以手动使用 NSManagedObjectModel API 加载每个模型并手动创建一个包含来自这两个模型的实体的新模型。 NSEntityDescriptionNSPropertyDescription 类(及其子类)确实实现了 NSCopying 协议(protocol),因此在大多数情况下,您应该能够从每个组件模型到您的整体模型。

此外,NS*Description 类都支持 userInfo 字典,您可以在 Xcode 的数据建模工具中编辑该字典,您可以使用它来执行诸如标记目标之类的操作作为替身的关系。例如,在模型 1 中,您可以拥有一个带有 userInfoMyRealEntityBar 实体,并在创建合并模型时检查该实体,作为发出信号以使用真实实体。

您还需要将替代实体与替代实体建立逆向关系;合并后这些将被替换为真实的逆。不过,您不必在所有模型中完全复制您的替代实体;您只需要在实体中的真实模型中使用逆关系。

因此,如果您真正的 Foo 有一个 name 属性,并且您真正的 Bar 有一个 kind 属性,那么您的替代 FooBar 不需要这些,只需替代 toBartoFoo 关系。

这里有一些代码演示了我正在谈论的内容:

- (NSManagedObjectModel *)mergeModelsReplacingDuplicates:(NSArray *)models {
NSManagedObjectModel *mergedModel = [[[NSManagedObjectModel alloc] init] autorelease];

// General strategy: For each model, copy its non-placeholder entities
// and add them to the merged model. Placeholder entities are identified
// by a MyRealEntity key in their userInfo (which names their real entity,
// though their mere existence is sufficient for the merging).

NSMutableArray *mergedModelEntities = [NSMutableArray arrayWithCapacity:0];

for (NSManagedObjectModel *model in models) {
for (NSEntityDescription *entity in [model entities]) {
if ([[entity userInfo] objectForKey:@"MyRealEntity"] == nil) {
NSEntityDescription *newEntity = [entity copy];
[mergedModelEntities addObject:newEntity];
[newEntity release];
} else {
// Ignore placeholder.
}
}
}

[mergedModel setEntities:mergedModelEntities];

return mergedModel;
}

这是有效的,因为核心数据中的 NS*Description 对象的复制是按名称而不是按关系的目标实体和反向实体(以及实体的子实体)的值。因此,虽然模型是可变的(也就是说,在将其设置为 NSPersistentStoreCoordinator 的模型之前),但您可以使用类似这样的技巧将模型分解为多个模型。

关于cocoa - NSManagedObjectModel 中合并模型的跨模型关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/130316/

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