通过 UISearchBar 使用 CoreData 过滤查询
Posted
技术标签:
【中文标题】通过 UISearchBar 使用 CoreData 过滤查询【英文标题】:Filtering query using CoreData through UISearchBar 【发布时间】:2019-06-15 07:05:35 【问题描述】:我使用CoreData
来收集我的数据,它有 2 个entities
是类别和项目,每个类别与项目有很多关系,我也有一个 UISearchBar
来过滤数据,但是每当我尝试搜索它会显示 Item 实体中的每一个项目,我需要做的是只显示与类别本身相关的项目,以便它显示我选择的类别的项目,我的代码如上所示。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
let request : NSFetchRequest <Item> = Item.fetchRequest()
request.predicate = NSPredicate(format: "name CONTAINS [cd] %@", searchBar.text!)
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
do
itemArray = try context.fetch(request)
catch
print(error)
tableView.reloadData()
if searchBar.text?.count == 0
loadItems()
tableView.reloadData()
DispatchQueue.main.async
searchBar.resignFirstResponder()
这是显示 Item 实体上每个项目的代码,我猜它可能与我初始化的请求有关。
【问题讨论】:
【参考方案1】:您必须将类别信息添加到谓词。必须有一种独特的方式来识别类别。在下面的代码中,假设Item
中存在category
关系,该关系在包含当前类别的类中具有name
属性和变量category
在方法结束时检查空搜索字符串是不好的做法。
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String)
guard let searchText = searchBar.text else return
if searchText.isEmpty
loadItems()
tableView.reloadData()
DispatchQueue.main.async
searchBar.resignFirstResponder()
else
let request : NSFetchRequest<Item> = Item.fetchRequest()
request.predicate = NSPredicate(format: "name CONTAINS [cd] %@ AND category.name == %@", searchText, category.name)
request.sortDescriptors = [NSSortDescriptor(key: "name", ascending: true)]
do
itemArray = try context.fetch(request)
catch
print(error)
tableView.reloadData()
【讨论】:
非常感谢它完美的工作!但我能问你为什么这是一种不好的做法吗?我自己也是初学者,如果你能告诉我,我将不胜感激 无论搜索文本的长度如何,您都将执行提取。我的代码首先检查空字符串(顺便说一下isEmpty
比.count == 0
好得多),然后使用else
子句加载所有数据或执行提取。以上是关于通过 UISearchBar 使用 CoreData 过滤查询的主要内容,如果未能解决你的问题,请参考以下文章
Swift:UISearchBar,通过 NSPredicate 名字或姓氏查找 Person
通过 UISearchBar 过滤后 UITableView 不滚动顶部
如何在 iOS 10 的目标 c 中使用 uisearchbar?