gpt4 book ai didi

objective-c - 查询核心数据中多个子实体类型的所有对象

转载 作者:太空狗 更新时间:2023-10-30 03:33:14 26 4
gpt4 key购买 nike

给定以下人为的示例:

Core Data entity diagram for my Awesome Pet Shop App (patent pending)

我想查询我的数据以查找猫或狗的所有对象。我希望结果集按名称排序而不考虑物种,因此获取所有猫然后获取所有狗是行不通的。我想在单个查询中执行此操作。

一种方法是向 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...

但仅仅想到要那样做就让我不寒而栗。有没有更好的办法?


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

为了提供一些上下文,真实的数据模型比这复杂一点(它们并不总是如此),但它组织得很好。在我的时间里,我设计的数据模式超出了我的公平份额,我很高兴实体及其关系得到了充分考虑。出现这个问题是因为(为了扩展已经摇摇欲坠的人为示例)客户最初想要:

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

到目前为止,还不错。但他们也想要一个显示所有猫和狗的组合列表的 View ,“因为小女孩喜欢猫和狗”。 (出于同样的原因,最初是猫和金鱼。)实际上并没有一种方法可以自然地将具体实体的子集分组;这真的很随意。

到目前为止,Dave Dribin 的“抽象中间实体”方法似乎是最干净的解决方案,尽管在我的例子中我认为它有点做作;实际上,您可以如实地将中间实体标记为“ThingLittleGirlsLike”的唯一方法! :)

最佳答案

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

我认为真正的问题是:你想做什么?如果你真的需要在没有 Goldfish 的情况下获取 CatsDogs,那么你的模型应该反射(reflect)这一点。您可以插入一个 FourLeggedPet 抽象实体作为 CatDog 的父级。然后,在您的获​​取请求中,使用 FourLeggedPet 作为带有 setIncludesSubentities:YES 的实体。

关于objective-c - 查询核心数据中多个子实体类型的所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6530340/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com