我有一个带有Task和List的Core Data模型,其中List与Task有许多有序的关系,而Task与List有着倒数的关系 . 我需要以正确的顺序从给定列表中检索任务,但过滤以匹配谓词 . 例如,如果 priority
是Task上的字段,
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 回答
我认为以下方法可行,但效率非常低:
使用所需的谓词获取所需的
Tasks
,确保获取请求的returnsObjectsAsFaults
属性设置为true .创建一个格式为"SELF IN %@"的新谓词,将任务数组(从步骤1开始)作为参数传递 .
使用新谓词过滤有序集(
list.tasks
) .这样,谓词在商店中进行评估,而不会导致任务错误,而订单仍然由有序关系决定 .
除非您使用有序关系,否则
Task
实体不会以任何特定顺序返回,除非您对NSFetchRequest
进行排序 .我建议在
NSFetchRequest
中添加一个排序,然后根据你给你的任务顺序排序 . 然后他们会以一致的顺序回来 .顺便说一下, NEVER 将
nil
传递给error:
参数 . 这只会隐藏未来的潜在错误 .