iPhone Core Data - 访问具有多种关系的深层属性

Posted

技术标签:

【中文标题】iPhone Core Data - 访问具有多种关系的深层属性【英文标题】:iPhone Core Data - Access deep attributes with to many relationships 【发布时间】:2010-04-19 14:26:37 【问题描述】:

假设我有一个实体用户,它与实体菜单具有一对多关系,与实体餐具有一对多关系,与具有一对多关系的实体食谱具有多对一关系与实体元素。 我想做的是选择属于特定用户(用户名 = myUsername)和特定菜单s(minDate

有人知道如何获得它们吗?

谢谢

【问题讨论】:

【参考方案1】:

您想对元素实体进行提取。根据您的描述,尚不清楚您是否定义了反向关系1(例如元素到接收方)以及它们是对多还是对一。假设您已定义它们并且它们是一对一的,您可以使用 [2] 之类的谓词进行获取:

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

我使用LIKE[cd] 对用户名进行不区分大小写和不区分变音符号的比较。另请注意,Core Data 将日期存储为双精度 NSTimeInterval,没有时区信息。如果您想进行时区敏感的日期比较,则需要做更多的工作。

1如果你还没有定义逆向关系,做吧。正如在其他地方多次说过的那样,Core Data 是一个图形管理框架,恰好能够将其图形持久化到磁盘。如果您定义了反向关系,它将自动为您维护参照完整性,它会在幕后做很多工作。特别是对于多对多关系,Core Data 实际上需要逆向来使事情正常进行。

[2] 如果您在我假设为一的地方定义了多对数的逆,您将不得不使用稍微复杂一点的谓词。例如,第一个子句是

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

(最后一点未经测试;KVO 集合运算符对我来说总是有点试验性)。您可以阅读set and array KVO 运算符。

【讨论】:

谢谢...它(第二种情况)几乎就是我想要的!我在食谱和膳食之间有一对多的关系。我不明白的是@unionOfSets。它有什么作用?它是否“合并”了许多关系(在我的情况下是饭菜)?还是我必须写:recipe.@unionOfSets.meal.menu.date? 哦,我忘了……我的一些元素与食谱无关!所以当我尝试这个时:@unionOfSets.recipe.meal.menu.date 我得到一个错误!我怎样才能解决这个问题? 您可以在developer.apple.com/mac/library/documentation/cocoa/conceptual/… 阅读@unionOfSets。是的,您可能需要recipie.@unionOfSets @ncohen,你的意思是一些元素没有在配方关系上设置任何配方实例,或者你有多个元素实体,其中一些根本没有配方关系?在第一种情况下,你很好。在第二种情况下,您无法按照描述执行查询。

以上是关于iPhone Core Data - 访问具有多种关系的深层属性的主要内容,如果未能解决你的问题,请参考以下文章

iPhone 如何使用 Core Data 修改 Persistent store 中包含的数据

iPhone iOS Core Data 我应该为我的实体子类化一个抽象实体吗?

iPhone在Core Data中保存多个对象?

iPhone Core Data 关系故障

Core Data iphone调试指针

iPhone:为啥 Core Data 中的 Bulk Inserts 这么慢?