在更新 tableview 时,如何使用搜索栏对我的 NSFetchedResults 数据进行排序,而不会在 fetchedRC.performFetch() 上崩溃?更新
How do I use a search bar to sort my NSFetchedResults data without it crashing on fetchedRC.performFetch(), while updating tableview? UPDATED
我的数据在尝试搜索之前加载正常,但是当我开始在搜索栏中输入内容时,它在调用 try fetchedRC.performFetch()
时崩溃了
我已经尝试使用谷歌搜索并更改代码,但似乎没有任何效果。
这是我从与 CoreData 中数据的 one-to-many 关系中获取数据的设置。
func setupFetchedResultsController() {
//fetchedRC = nil
let request = Item.fetchRequest() as NSFetchRequest<Item>
if !currentSearchText.isEmpty && !(currentSearchText == " ") {
request.predicate = NSPredicate(format: "list.name CONTAINS[c] \(currentSearchText)", parentObj)
} else {
request.predicate = NSPredicate(format: "list = %@", parentObj)
}
//list CONTAINS[c] \(currentSearchText)
let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true)
request.sortDescriptors = [sort]
do {
fetchedRC = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
try fetchedRC.performFetch()
self.tableView.reloadData()
} catch let error as NSError {
print(error.localizedDescription)
}
fetchedRC.delegate = self
}
这是我的 updateSearchResults 函数
func updateSearchResults(for searchController: UISearchController) {
guard let text = searchController.searchBar.text else { return }
currentSearchText = text
//fetchedRC = nil
setupFetchedResultsController()
}
我已经设置好了,所以有一个 parent 列表和许多 child 项。我期望发生的是让 children 显示包含用户在搜索栏中输入的内容。因此,当用户在搜索栏中键入更多内容时,它会更新并进一步优化搜索。实际发生的是它在调用 try fetchedRC.performFetch()
时崩溃。解决这个问题的方法是什么?我也是 FetchedResultsController 的新手。
这也是它崩溃时给出的错误信息:CoreData:error: SQLCore dispatchRequest: exception handling request: <NSSQLFetchRequestContext: 0x28180cee0> , unimplemented SQL generation for predicate : (list CONTAINS[c] A) (LHS and RHS both keypaths) with userInfo of (null)
请注意,我也知道 request.predicate
中的 list.name
是不正确的,我只是作为占位符这样做,希望它更容易理解。
我找到了问题的解决方案,希望这也能帮助其他人解决这个问题。
func setupFetchedResultsController() {
let request = Item.fetchRequest() as NSFetchRequest<Item>
//This line simplified just to help it be more reliable
if (currentSearchText.count > 0) {
// Line Updated and Fixed Problem
request.predicate = NSPredicate(format: "list = %@ && name CONTAINS %@", parentObj, currentSearchText)
} else {
request.predicate = NSPredicate(format: "list = %@", parentObj)
}
let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true)
request.sortDescriptors = [sort]
do {
fetchedRC = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
try fetchedRC.performFetch()
self.tableView.reloadData()
} catch let error as NSError {
print(error.localizedDescription)
}
fetchedRC.delegate = self
}
我的数据在尝试搜索之前加载正常,但是当我开始在搜索栏中输入内容时,它在调用 try fetchedRC.performFetch()
我已经尝试使用谷歌搜索并更改代码,但似乎没有任何效果。
这是我从与 CoreData 中数据的 one-to-many 关系中获取数据的设置。
func setupFetchedResultsController() {
//fetchedRC = nil
let request = Item.fetchRequest() as NSFetchRequest<Item>
if !currentSearchText.isEmpty && !(currentSearchText == " ") {
request.predicate = NSPredicate(format: "list.name CONTAINS[c] \(currentSearchText)", parentObj)
} else {
request.predicate = NSPredicate(format: "list = %@", parentObj)
}
//list CONTAINS[c] \(currentSearchText)
let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true)
request.sortDescriptors = [sort]
do {
fetchedRC = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
try fetchedRC.performFetch()
self.tableView.reloadData()
} catch let error as NSError {
print(error.localizedDescription)
}
fetchedRC.delegate = self
}
这是我的 updateSearchResults 函数
func updateSearchResults(for searchController: UISearchController) {
guard let text = searchController.searchBar.text else { return }
currentSearchText = text
//fetchedRC = nil
setupFetchedResultsController()
}
我已经设置好了,所以有一个 parent 列表和许多 child 项。我期望发生的是让 children 显示包含用户在搜索栏中输入的内容。因此,当用户在搜索栏中键入更多内容时,它会更新并进一步优化搜索。实际发生的是它在调用 try fetchedRC.performFetch()
时崩溃。解决这个问题的方法是什么?我也是 FetchedResultsController 的新手。
这也是它崩溃时给出的错误信息:CoreData:error: SQLCore dispatchRequest: exception handling request: <NSSQLFetchRequestContext: 0x28180cee0> , unimplemented SQL generation for predicate : (list CONTAINS[c] A) (LHS and RHS both keypaths) with userInfo of (null)
请注意,我也知道 request.predicate
中的 list.name
是不正确的,我只是作为占位符这样做,希望它更容易理解。
我找到了问题的解决方案,希望这也能帮助其他人解决这个问题。
func setupFetchedResultsController() {
let request = Item.fetchRequest() as NSFetchRequest<Item>
//This line simplified just to help it be more reliable
if (currentSearchText.count > 0) {
// Line Updated and Fixed Problem
request.predicate = NSPredicate(format: "list = %@ && name CONTAINS %@", parentObj, currentSearchText)
} else {
request.predicate = NSPredicate(format: "list = %@", parentObj)
}
let sort = NSSortDescriptor(key: #keyPath(Item.isComplete), ascending: true)
request.sortDescriptors = [sort]
do {
fetchedRC = NSFetchedResultsController(fetchRequest: request, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: nil)
try fetchedRC.performFetch()
self.tableView.reloadData()
} catch let error as NSError {
print(error.localizedDescription)
}
fetchedRC.delegate = self
}