使用NSPredicate进行核心数据递归搜索

时间:2016-05-23 22:21:19

标签: ios core-data nspredicate

我有一个项目使用Core Data和“folder”和“document”实体。文件夹可以包含许多文档,也可以包含其他文件夹。

我正在开发搜索功能,在当前版本中,我有类似这样的内容,可以在特定文件夹中查找名称与搜索文本部分匹配的文档/文件夹:

let predicate = NSPredicate(format: "parentFolder == %@ AND name CONTAINS[cd] %@", folderToSearch, searchText)
fetchedResultsController.fetchRequest.predicate = predicate

但是,我希望它也可以在当前子文件夹中搜索(如果找到匹配项,则在结果中包含包含文件夹)。

例如,如果我的文件夹/文档结构是这样的(假设Shopping文件夹和Travel文件夹包含在同一个父文件夹中):

Shopping
    Groceries
        - toothpaste
        - cheese
Travel
    Packing
        - toothpaste
        - toothbrush

...我搜索了“牙膏”,我希望搜索返回“Shopping”文件夹对象和“Travel”文件夹对象。

我需要的是这样的事情:

let predicate = NSPredicate(format: "parentFolder == %@ AND name (OR ANY OF IT'S CHILDREN'S NAMES) CONTAINS[cd] %@", folderToSearch, searchText)
fetchedResultsController.fetchRequest.predicate = predicate

有没有办法形成NSPredicate来做我想做的事?

或者我应该考虑做些什么?

更新:是的,已经有similar question了。然而,那里接受的答案建议使用“瞬态布尔属性”并在NSPredicate中使用它......但是我读过的其他内容都表明在使用SQLite存储时不起作用。 (请参阅thisthis。)所以我认为我的问题仍然有效。我还更新了我的问题,以明确我需要的内容。

请注意,当我第一次发布此问题时,我错误地考虑添加一个瞬态属性来确定文档/文件夹是否是子/孙等。搜索开始的文件夹,并将谓词更改为:

let predicate = NSPredicate(format: "isDescendentOfSearchParent == YES AND name CONTAINS[cd] %@", searchText)
fetchedResultsController.fetchRequest.predicate = predicate

......但很快就了解到transient properties don't work in NSPredicates when used with an SQLite store。 (另外,这将返回与搜索文本匹配的文档/文件夹,而不是其包含的文件夹...这不是我想要的。)

0 个答案:

没有答案