2010-04-19 38 views
1

假设我有一个实体用户,它与实体菜单有一对多的关系,它与具有多对一关系的实体餐具有一对多的关系实体配方与实体元素具有一对多的关系。 我想要做的是选择属于特定用户(用户名= myUsername)和特定菜单的元素s(最小日期< menu.date < maxDate)。iPhone核心数据 - 访问多种关系的深度属性

有没有人有想法如何让他们?

谢谢

回答

2

您想要对元素实体进行提取。根据你的描述,目前还不清楚你是否定义了反向关系1(例如元素到收件人)以及他们是多人还是一人。假设你有他们定义,他们是对的,你可以做像[2]谓词中的抓取:对USENAME不区分大小写和变音符号,大小写的比较

[NSPredicate predicateWithFormat:@"%@ > recipe.meal.menu.date && recipie.meal.menu.date < %@ && recipie.meal.menu.user.username LIKE[cd] %@", minDate, maxDate, myUsername]; 

我用LIKE[cd]。另请注意,核心数据存储日期为双重NSTimeInterval,没有时区信息。如果你想做时区敏感的日期比较,你需要做更多的工作。

1如果您还没有定义相反的关系,这样做。正如其他地方多次说过的,Core Data是一种图形管理框架,它恰好能够将其图形保存到磁盘。如果您定义了反向关系,它将自动执行很多幕后工作以保持参考完整性。特别是对于多对多关系,Core Data实际上需要相反才能使事情顺利进行。

[2]如果你已经定义了许多我认为是的倒数,你必须使用一个稍微复杂的谓词。第一条,例如,将

@"ANY (@unionOfSets.recipe.meal.menu.date) < %@" 

(这最后一位是未经检验,该志愿组运营商总是有点经历过了我的)。您可以阅读set and array KVO运营商。

+0

谢谢......它(第二种情况)几乎是我在找的东西!食谱和餐食之间有一对多的关系。我不明白的是@unionOfSets。它有什么作用?它是否“融合”了多种关系(在我的情况下是餐)?或者我必须写:配方。@ unionOfSets.meal.menu.date? – ncohen 2010-04-19 23:35:36

+0

哦,我忘了......我的一些元素与配方没有关系!所以当我尝试这个:@ unionOfSets.recipe.meal.menu.date我得到一个错误!我怎样才能摆脱这一点? – ncohen 2010-04-19 23:42:03

+0

您可以在http://union.apple.com/mac/library/documentation/cocoa/conceptual/KeyValueCoding/Concepts/ArrayOperators.html上阅读@unionOfSets。是的,你可能需要'recipie。@ unionOfSets'。 – 2010-04-20 16:37:01