首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合并模型中的NSManagedObjectModel中的跨模型关系?

合并模型中的NSManagedObjectModel中的跨模型关系?
EN

Stack Overflow用户
提问于 2008-09-24 22:27:01
回答 1查看 2.3K关注 0票数 9

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2008-09-26 06:47:36

模型1和模型2都不能在运行时加载,除非它们是格式良好的- that,除非toBartoFoo关系有目的地。此外,如果模型1和模型2具有同名的模型,您将无法从它们创建合并的模型;它们将不会合并,它们将发生冲突,这是错误的。

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

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

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

因此,如果您的真实Foo有一个name属性,而您的真实Bar有一个kind属性,那么您的替身FooBar将不需要这些属性,只需要替身toBartoFoo关系。

下面是一些代码,演示了我正在讨论的内容:

代码语言:javascript
运行
复制
- (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的模型之前,- that是可变的--您可以使用这样的技巧将模型分解为多个模型。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/130316

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档