核心数据过滤器到许多与谓词有序的关系

Core Data filter to many ordered relationship with predicate

我有一个包含 Task 和 List 的核心数据模型,其中 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];

但任务顺序未保留。

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

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

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

顺便说一句,从不nil 传递给error: 参数。这只会在未来隐藏一个潜在的错误。

我认为下面的方法可以,虽然效率很低:

  1. 使用您想要的谓词获取所需的 Tasks,确保获取请求的 returnsObjectsAsFaults 属性 设置为 true。
  2. 创建格式为 "SELF IN %@" 的新谓词,将任务数组(来自步骤 1)作为参数传递。
  3. 使用新谓词过滤有序集 (list.tasks)。

这样谓词在存储中进行评估,不会在任务中出错,而顺序仍然由有序关系决定。