首页 文章

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

提问于
浏览
0

我有一个带有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 回答

  • 0

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

    • 使用所需的谓词获取所需的 Tasks ,确保获取请求的 returnsObjectsAsFaults 属性设置为true .

    • 创建一个格式为"SELF IN %@"的新谓词,将任务数组(从步骤1开始)作为参数传递 .

    • 使用新谓词过滤有序集( list.tasks ) .

    这样,谓词在商店中进行评估,而不会导致任务错误,而订单仍然由有序关系决定 .

  • 0

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

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

    顺便说一下, NEVERnil 传递给 error: 参数 . 这只会隐藏未来的潜在错误 .

相关问题