Как правильно использовать панель поиска с NSFetchedResultsController и NSPredicate с базовыми данными? - PullRequest
0 голосов
/ 09 декабря 2018

Я использую fetchedResultsController для заполнения табличного представления списком имен.Когда представление загружается, табличное представление заполняется правильно, используя имена, хранящиеся в Базовых данных.

func attemptFetch() {

    let fetchRequest: NSFetchRequest<Respondent> = Respondent.fetchRequest()
    let lastSort = NSSortDescriptor(key: "last", ascending: true)
    let firstSort = NSSortDescriptor(key: "first", ascending: true)

    fetchRequest.sortDescriptors = [lastSort, firstSort]

    let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: "firstCache")

    controller.delegate = self

    self.controller = controller

    do {
        try controller.performFetch()
    } catch {
        let error = error as NSError
        print ("\(error)")
    }
}

Отображение на устройстве: enter image description here

Проблема I 'у меня есть то, что когда я использую функцию searchBar для поиска имени и использую этот текст для установки предиката, executeFetch завершается ошибкой, указывая на то, что я дал неверный аргумент.Вот моя функция:

func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    if let textInSearchBar = searchBar.text {

        let fetchRequest: NSFetchRequest<Respondent> = Respondent.fetchRequest()

        //set up sortDescriptor for fetch
        let lastSort = NSSortDescriptor(key: "last", ascending: true)
        let firstSort = NSSortDescriptor(key: "first", ascending: true)
        fetchRequest.sortDescriptors = [lastSort, firstSort]

        let searchPredicate = NSPredicate(format: "first contains[c] %@", textInSearchBar)

        fetchRequest.predicate = searchPredicate

        let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)

        controller.delegate = self

        self.controller = controller

        do {
            try self.controller.performFetch()
        } catch {
            let error = error as NSError
            print ("\(error)")
        }
        tableView.reloadData()
    }
}

Я получаю ошибку:

2018-12-08 15: 33: софт-тач 09.100555-0700 [83481: 3507366] [ошибка] ошибка: SQLCore dispatchRequest: запрос на обработку исключения: нереализованная генерация SQL для предиката: (FIRST CONTAINS [c] «John») (плохое RHS) с userInfo (ноль) CoreData: ошибка: SQLCore dispatchRequest: запрос на обработку исключения:, не реализованГенерация SQL для предиката: (ПЕРВЫЙ СОДЕРЖИТ [c] «Джон») (плохая RHS) с userInfo (ноль)чтобы исключить исключение «NSInvalidArgumentException», причина: «невыполненная генерация SQL для предиката: (FIRST CONTAINS [c]« John ») (плохое RHS)»

Это озадачивает меня, потому что я рассказал о том, каксоздать предикат, и я думаю, что я создал его правильно.Я также знаю, что у меня в базовом классе данных Респондента есть атрибут String: enter image description here

Я не уверен, в чем я ошибаюсь.Спасибо.

...