查询Core Data中多个子实体类型的所有对象

Sim*_*ker 8 cocoa core-data objective-c

鉴于以下人为的例子:

我的Awesome Pet Shop应用程序的核心数据实体图(正在申请专利)

我想查询我的数据,以查找猫或狗的所有对象.我希望结果集按名称排序,无论种类如何,所以取出所有的猫然后取出所有的狗都行不通.我想在一个查询中执行此操作.

一种方法是向Pet添加一个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...
Run Code Online (Sandbox Code Playgroud)

但仅仅想到这样做会让我不寒而栗.有没有更好的办法?


更新:感谢所有回复的人 - 这里有一些非常好的,经过深思熟虑的解决方案,我很感激所有这些.

为了给出这个上下文,真正的数据模型比这更复杂(不是它们总是如此),但它组织得非常好.在我的时间里,我设计的数据模式比我公平的数据模式更多,我很高兴实体及其关系得到充分考虑.这个问题的出现是因为(为了扩展已经摇摇欲坠的人为例子)客户原本想要:

  • 显示所有宠物列表的视图
  • 显示金鱼列表的视图
  • 显示猫列表的视图
  • 显示狗列表的视图

到现在为止还挺好.但他们也想要一个显示所有猫和狗的综合列表的视图"因为小女孩喜欢猫和狗".(最初它是猫和金鱼,出于同样的原因.)实际上并没有一种方法可以自然地对那些具体实体的子集进行分组; 它真的很随意.

到目前为止,Dave Dribin的"抽象中间实体"方法似乎是最干净的解决方案,尽管在我的情况下我认为它会有点人为; 真正唯一可以如实标记中间实体的方式就是"ThingLittleGirlsLike"!:)

Dav*_*bin 3

正如您所发现的,您不能entity.name在 SQLite 存储的获取谓词中使用它(您可以在其他存储类型上使用它)。您可以按照您的建议添加一个petType,它效果很好,但也让我不寒而栗。作为替代方案,您可以获取所有Pets,然后根据 过滤获取的结果entity.name。但这有点低效,因为您加载的实体超出了您的需要,并且您执行了 SQLite 可以代表您执行的内存中过滤。

我认为真正的问题是:你想做什么?如果您确实需要获取Catsand Dogswithout Goldfish,那么您的模型应该反映这一点。您可以插入一个抽象实体作为和FourLeggedPet的父级。然后,在您的提取请求中,将 用作实体。CatDogFourLeggedPetsetIncludesSubentities:YES