我不熟悉swift中的核心数据,需要使用nspredicate的帮助。我的应用程序中目前有一个表格视图和一个搜索栏。我还有一个名为item的实体,其属性为过敏原(string)。我希望筛选此表视图,以便单元格仅在searchbar.text等于item.allergen时显示。
func attemptFetch() {
let fetchRequest: NSFetchRequest<Item> = Item.fetchRequest()
let dateSort = NSSortDescriptor(key: "created", ascending: false)
let titleSort = NSSortDescriptor(key: "title", ascending: true)
if segment.selectedSegmentIndex == 0 {
fetchRequest.sortDescriptors = [dateSort]
} else if segment.selectedSegmentIndex == 1 {
fetchRequest.sortDescriptors = [titleSort]
} else {
if searchBar.text != nil, searchBar.text != ""{
print("Search bar text exists")
print(searchBar.text!)
fetchRequest.sortDescriptors = [titleSort]
//Search; Only display cell if searchBar.text = Item.allergen
} else {
print("Search bar text does not exist!")
fetchRequest.sortDescriptors = [titleSort]
}
}
let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
controller.delegate = self
self.controller = controller
do {
try controller.performFetch()
} catch {
let error = error as NSError
print("\(error)")
}
}
我尝试使用nspredicate执行此操作,但结果是在实体错误中找不到密钥路径。我会包括这段代码,但我确信这完全是错误的。
有什么建议吗?
更新:
希望这是你需要的。
更新2:
谢谢你的帮助!我找到了解决办法。这就是适用于我的代码:
let userSearch = searchBar.text!
commitPredicate = NSPredicate(format: "allergen == %@", userSearch)
fetchRequest.predicate = commitPredicate
最佳答案
添加以下谓词以仅筛选与搜索文本完全匹配的谓词:
fetchRequest.predicate = NSPredicate(format:"allergen == %@", searchBar.text)
或者,如果
allergen
字符串包含搜索文本,则可能需要匹配:fetchRequest.predicate = NSPredicate(format:"allergen CONTAINS %@", searchBar.text)
要使比较大小写和音调不敏感,请添加
[cd]
(so... ==[cd] ...
或... CONTAINS[cd] ...
)。