当前位置:  开发笔记 > IOS > 正文

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

如何解决《NSManagedObjectModel中的合并模型中的跨模型关系?》经验,为你挑选了1个好方法。

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

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



1> Chris Hanson..:

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

但是,您可以NSManagedObjectModel手动使用API来加载每个模型,并手动创建包含两者实体的新模型.在NSEntityDescriptionNSPropertyDescription类(和它的子类)国家执行NSCopying协议,在大多数情况下,你就应该能够从每个组件模型在复制的属性到你的整体模型.

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

您还需要为您的替身实体建立替代关系; 这些将在合并后被真正的逆转所取代.但是,您不必在所有模型中完全复制您的替身实体; 您只需要在实体中使用真实模型中使用的反向关系.

因此,如果你真正Foo有一个name属性,你真正的酒吧有一个kind属性,你的替身Foo,并Bar不会需要这些,只是替身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*DescriptionCore Data 中对象的复制是关于关系的目标实体和逆(以及实体的子实体)的名称而不是按值.因此,虽然模型是可变的 - 也就是说,在它被设置为模型之前NSPersistentStoreCoordinator- 你可以使用这样的技巧将你的模型分解成多个模型.

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有