核心数据过滤到与谓词

时间:2015-07-14 14:51:38

标签: ios core-data many-to-many nspredicate nsfetchrequest

我有一个带有Task和List的Core Data模型,其中List与Task有许多有序的关系,而Task与List有着倒数的关系。我需要以正确的顺序从给定列表中检索任务,但过滤以匹配谓词。例如,如果priority是任务上的字段,

NSPredicate* predicate = [NSPredicate predicateWithString:@"priority == HIGH"]

List* list; // already fetched 

我可以通过

完成它
NSArray* allTasks = list.tasks;
NSArray* someTasks = [allTasks filteredArrayUsingPredicate:predicate];

但这需要将所有任务都拉入内存。我可以直接获取任务

NSFetchRequest* req = [[NSFetchRequest alloc] initWithEntityName:@"Task"];
[req setPredicate:[NSPredicate predicateWithFormat:@"list == %@ AND priority == HIGH", list]];
NSArray* someTasks = [context executeFetchRequest:req error:&error];

但随后不会保留任务顺序。

有没有办法通过谓词过滤关系错误?

2 个答案:

答案 0 :(得分:0)

除非您使用有序关系,否则Task实体不会以任何特定顺序返回,除非您对NSFetchRequest进行排序。

我建议在NSFetchRequest中添加一个排序,然后根据您给出的任务顺序排序。然后他们会以一致的顺序回来。

另外,从不nil传递给error:参数。这只会隐藏未来的潜在错误。

答案 1 :(得分:0)

我认为以下方法可行,但效率非常低:

  1. 使用所需的谓词获取所需的Tasks,确保获取请求的returnsObjectsAsFaults属性设置为true。
  2. 创建一个格式为“SELF IN%@”的新谓词,将任务数组(从步骤1开始)作为参数传递。
  3. 使用新谓词过滤有序集(list.tasks)。
  4. 这样,谓词在商店中进行评估,而不会导致任务失误,而订单仍由有序关系决定。