考虑下面的人为的例子多个子实体类型的所有对象:查询核心数据
我想查询我的数据项目,是指猫或狗的所有对象。我希望结果集按名称排列,不管物种如何,因此抓取所有的猫然后抓取所有的狗都不行。我想在单个查询中执行此操作。要做到这一点
一个办法是到petType字段添加到宠物,给每一个记录,可确定它属于子实体一个petType值,然后查询像这样:
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Pet"
inManagedObjectContext:myMOC];
[fetchRequest setEntity:entity];
// petType values: 1 = dog, 2 = cat, 3 = goldfish. Yuk.
NSPredicate *p = [NSPredicate predicateWithFormat:@"petType = 1 OR petType = 2"]
[fetchRequest setPredicate:p];
// etc...
但仅凭想到这样做让我不寒而栗。有没有更好的办法?
更新:感谢所有那些谁已经回答 - 有一些很好的,深思熟虑的解决方案,在这里,我感激他们。
为了给出这个上下文,真实的数据模型比这更复杂一些(他们总是不是这样),但是它的组织很好。我在这个时代设计了比我公平分享的数据模式,我很高兴这些实体及其关系得到了充分的考虑。这个问题已经发生了,因为(延长原本就摇摇欲坠的人为的例子),客户原本想:
- 显示所有宠物列表的视图
- 显示金鱼
- 一个图,显示的列表视图猫
- 视图显示到目前为止狗
的名单列表,那么好。但他们也希望看到所有猫和狗的组合清单“因为小女孩喜欢猫和狗”。 (起初它是猫和金鱼,出于同样的原因。)没有真正的方法来自然地将具体实体的子集分组;它真的很随意。到目前为止,Dave Dribin的“抽象中间实体”方法似乎是最干净的解决方案,尽管在我的案例中我认为它会有些人为的;真正能够如实标注中间实体的唯一方法就是“ThingLittleGirlsLike”! :)
+1通常情况下,像这样的问题是由于糟糕的模型设计造成的。在这种情况下,似乎宠物对象会与其他东西(目前未定义)相关,例如一个所有者。如果你有一个所有者关系,那么你可以问问主人的宠物和你的完成。数据模型可能非常复杂,您应该利用该模型来紧密模拟/模拟应用程序处理的实际对象,条件和事件。一旦你这样做,你通常会发现你的排序,谓词和提取自动简化。 – TechZen
谢谢!我所做的例子只是反映了我的现实世界的用例,但中间FourLeggedPet实体的想法对我来说很好,我认为。 (顺便说一句,'includesEntities'默认为'YES',不需要设置它。) –
@SimonWhitaker,就我而言,我想获取所有子实体(GoldFish,cats和dogs),但是要根据“邪恶”。有没有办法做到这一点?我正在使用fetchedresultsController,所以我必须设置一个fetchRequest。 – akshaynhegde