Фильтрация запросов с использованием CoreData через UISearchBar - PullRequest
2 голосов
/ 15 июня 2019

Я использовал 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 голосов
/ 15 июня 2019

Вы должны добавить информацию о категории в предикат.Должен быть уникальный способ определения категории.В приведенном ниже коде предполагается, что существует отношение 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()
    }
...