通过 UISearchBar 使用 CoreData 过滤查询
Filtering query using CoreData through UISearchBar
我用CoreData
来收集我的数据,它有2个entities
是类别和项目,每个类别与项目有很多关系,我有一个UISearchBar
也过滤数据,但是每当我尝试搜索时,它都会显示 Item 实体中的每个项目,我需要做的是只显示与类别本身相关的项目,以便它显示 I select 类别的项目,我的代码如上所示。
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 实体上每个项目的代码,我猜它可能与我初始化的请求有关。
您必须将类别信息添加到谓词中。必须有一种唯一的方式来识别类别。在下面的代码中,假设 Item
中有一个关系 category
,它有一个 name
属性,class 中有一个变量 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()
}
我用CoreData
来收集我的数据,它有2个entities
是类别和项目,每个类别与项目有很多关系,我有一个UISearchBar
也过滤数据,但是每当我尝试搜索时,它都会显示 Item 实体中的每个项目,我需要做的是只显示与类别本身相关的项目,以便它显示 I select 类别的项目,我的代码如上所示。
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 实体上每个项目的代码,我猜它可能与我初始化的请求有关。
您必须将类别信息添加到谓词中。必须有一种唯一的方式来识别类别。在下面的代码中,假设 Item
中有一个关系 category
,它有一个 name
属性,class 中有一个变量 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()
}