核心数据过滤器到许多与谓词有序的关系
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:
参数。这只会在未来隐藏一个潜在的错误。
我认为下面的方法可以,虽然效率很低:
- 使用您想要的谓词获取所需的
Tasks
,确保获取请求的 returnsObjectsAsFaults
属性 设置为 true。
- 创建格式为 "SELF IN %@" 的新谓词,将任务数组(来自步骤 1)作为参数传递。
- 使用新谓词过滤有序集 (
list.tasks
)。
这样谓词在存储中进行评估,不会在任务中出错,而顺序仍然由有序关系决定。
我有一个包含 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:
参数。这只会在未来隐藏一个潜在的错误。
我认为下面的方法可以,虽然效率很低:
- 使用您想要的谓词获取所需的
Tasks
,确保获取请求的returnsObjectsAsFaults
属性 设置为 true。 - 创建格式为 "SELF IN %@" 的新谓词,将任务数组(来自步骤 1)作为参数传递。
- 使用新谓词过滤有序集 (
list.tasks
)。
这样谓词在存储中进行评估,不会在任务中出错,而顺序仍然由有序关系决定。