通过UISearchBar使用CoreData筛选查询

时间:2019-06-15 07:05:35

标签: swift database core-data filter uisearchbar

我使用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 个答案:

答案 0 :(得分:0)

您必须将类别信息添加到谓词。必须有一种独特的方式来标识类别。在下面的代码中,假设category中存在一个关系Item,该关系具有一个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()
    }