核心数据:通过特定属性获取(加入关系)

时间:2010-09-16 10:54:19

标签: iphone macos core-data nsfetchrequest

我有一个核心数据模型如下

alt text

attributes的{​​{1}}属性是一组Page,它们是我的Page对象的值,非常类似于标准DictionaryEntry(除了所有NSDictionary 1}}和keys是字符串)

我的values Page DictionaryEntrykey="title"。我如何形成一个获取请求来加载该特定页面?

2 个答案:

答案 0 :(得分:7)

您应该查看子查询的谓词语法。您不能使用通常的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"不起作用,因为它还返回具有两个dicts的页面,例如key ='addr'/ value ='home'和key ='title'/ value ='pete'。

答案 1 :(得分:1)

假设您首先知道“Title”的DictionaryEntry的“键”。

创建NSPredicate时,为什么不使用已知的“密钥”在DictionaryEntry对象上创建NSFetchRequest。

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"DictionaryEntry" inManagedObjectContext:_context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"key == %@", keyValue]];

获得有效的DictionaryEntry对象后,您就可以使用CoreData简化的“页面”关系来获取有效的页面。