
例如,说模型1定义了一个具有关系(一对一)tobar的实体Foo,并且模型2定义了一个具有关系(一对一)toFoo的实体条.我将使用 – [NSManagedobjectModel mergedModelFromModels],合并模型1和模型2构建一个CoreData堆栈.有没有办法在数据建模器或编程中定义这些关系,以便它们表现得像模型间关系一样?
解决方法 模型1和模型2都不能在运行时加载,除非它们格式正确 – 也就是说,除非tobar和toFoo关系具有目的地.此外,如果模型1和模型2具有相同名称的模型,您将无法从中创建合并的模型;他们不会合并,他们会碰撞,这是一个错误.但是,您可以手动使用NSManagedobjectModel API加载每个模型,并手动创建一个包含两者的实体的新模型. NSEntityDescription和nspropertyDescription类(及其子类)确实实现了NScopying协议,因此在大多数情况下,您应该能够将属性从每个组件模型复制到整个模型.
此外,NS *描述类都支持您可以在Xcode的数据建模工具中编辑的用户信息字典,您可以使用它来做一些事情,例如将关系的目的地标记为备用.例如,在模型1中,您可以拥有一个具有userInfo密钥MyRealEntity的bar实体,并在创建合并模型时检查该实体,作为使用真实实体的信号.
您还需要与您的备用实体建立独立的反向关系;这些将在合并后被真正的反转代替.尽管如此,您不必完全复制所有型号的备用实体;您只需要在实体中的真实模型中使用的反向关系.
因此,如果您的真实Foo具有名称属性,并且您的真实bar具有一个实体属性,则您的Foo和bar将不再需要这些,只需要连接到bar和ToFoo关系.
这里有一些代码演示了我在说什么:
- (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 *描述对象是以关系的目标实体和反向(以及实体的子实体)为名而不是副值.因此,当一个模型是可变的 – 也就是说,在设置为NSPersistentStoreCoordinator的模型之前,您可以使用这样的技巧将模型分解成多个模型.
总结以上是内存溢出为你收集整理的可可 – 来自合并模型的NSManagedObjectModel中的跨模型关系?全部内容,希望文章能够帮你解决可可 – 来自合并模型的NSManagedObjectModel中的跨模型关系?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)