【问题标题】:Core Data: Fetch via specific property (join relationship)核心数据:通过特定属性获取(连接关系)
【发布时间】:2011-04-13 03:51:21
【问题描述】:
我有一个核心数据模型如下
Page 的attributes 属性是一组DictionaryEntry,它们是我的页面对象的值,很像标准的NSDictionary(除了所有keys 和values 都是字符串)
我有一个Page,其中有一个DictionaryEntry 和key="title" 和value="Home"。我将如何形成一个获取请求来加载该特定页面?
【问题讨论】:
标签:
iphone
macos
core-data
nsfetchrequest
【解决方案1】:
假设您首先知道“标题”的 DictionaryEntry 的“键”。
当你创建一个 NSPredicate 时,为什么不使用你已知的“key”在 DictionaryEntry 对象上创建一个 NSFetchRequest。
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"DictionaryEntry" inManagedObjectContext:_context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"key == %@", keyValue]];
一旦您拥有有效的 DictionaryEntry 对象,您就可以使用 CoreData 的“页面”关系来获取您的有效页面。
【解决方案2】:
您应该看看子查询的谓词语法。您不能使用通常的 ANY 关键字,因为这只允许您同时匹配一列而不是两列。
NSString *keyValue = @"title";
NSString *valueValue = @"home";
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Page" inManagedObjectContext:_context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"(SUBQUERY(attributes, $a, $a.key == %@ && $a.value == %@).@count != 0)", keyValue, valueValue]];
更简单的谓词ANY attributes.key = "title" AND ANY attributes.value = "home" 不起作用,因为它还返回具有两个字典的页面,例如key='addr'/value='home' 和 key='title'/value='pete'。