【问题标题】:Filtering query using CoreData through UISearchBar通过 UISearchBar 使用 CoreData 过滤查询
【发布时间】: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 实体上每个项目的代码,我猜它可能与我初始化的请求有关。

【问题讨论】:

    标签: swift database core-data filter uisearchbar


    【解决方案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 子句加载所有数据或执行提取。
    猜你喜欢
    • 2011-05-27
    • 2023-04-07
    • 1970-01-01
    • 2019-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 2019-06-18
    相关资源
    最近更新 更多