我有一个项目使用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存储时不起作用。 (请参阅this和this。)所以我认为我的问题仍然有效。我还更新了我的问题,以明确我需要的内容。
请注意,当我第一次发布此问题时,我错误地考虑添加一个瞬态属性来确定文档/文件夹是否是子/孙等。搜索开始的文件夹,并将谓词更改为:
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。 (另外,这将返回与搜索文本匹配的文档/文件夹,而不是其包含的文件夹...这不是我想要的。)