9

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

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

4

1 回答 1

16

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

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

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

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

因此,如果你的真实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;
}

这是有效的,因为 Core Data 中的对象复制NS*Description是按名称而不是按值相对于关系的目标实体和反向(以及实体的子实体)。因此,虽然一个模型是可变的——也就是说,在它被设置为一个模型之前NSPersistentStoreCoordinator——你可以使用这样的技巧将你的模型分解为多个模型。

于 2008-09-26T06:47:35.783 回答