在表视图中使用NSPredicate对核心数据进行排序(Swift)

问题描述:

我是Swift中的核心数据的新手,需要使用NSPredicate的帮助。我目前在我的应用程序中有一个表格视图和一个搜索栏。我也有一个名为Item的实体,具有过敏原(字符串)的属性。我想过滤这个表视图,以便只有当searchBar.text等于Item.allergen时才显示单元格。在表视图中使用NSPredicate对核心数据进行排序(Swift)

func attemptFetch() { 

    let fetchRequest: NSFetchRequest<Item> = Item.fetchRequest() 
    let dateSort = NSSortDescriptor(key: "created", ascending: false) 
    let titleSort = NSSortDescriptor(key: "title", ascending: true) 

    if segment.selectedSegmentIndex == 0 { 
     fetchRequest.sortDescriptors = [dateSort] 
    } else if segment.selectedSegmentIndex == 1 { 
     fetchRequest.sortDescriptors = [titleSort] 
    } else { 
     if searchBar.text != nil, searchBar.text != ""{ 
      print("Search bar text exists") 
      print(searchBar.text!) 
      fetchRequest.sortDescriptors = [titleSort] 

      //Search; Only display cell if searchBar.text = Item.allergen 


     } else { 
      print("Search bar text does not exist!") 
      fetchRequest.sortDescriptors = [titleSort] 
     } 
    } 

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

    controller.delegate = self 

    self.controller = controller 

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

我试图使用NSPredicate来做到这一点,但它导致在实体错误中找不到关键路径。我会包含这些代码,但我确定它完全错误。

有什么建议吗?

更新:

Here's a picture of the Item entity's attributes in the Core Data Model.This is the code in the ItemEntity.swift file, I think this was autogenerated?希望这是你需要的东西。

更新2: 感谢您的帮助!我找到了解决方案。这是为我工作的代码:

let userSearch = searchBar.text! 
commitPredicate = NSPredicate(format: "allergen == %@", userSearch) 
fetchRequest.predicate = commitPredicate 
+0

你还可以在这里发布你的物品类吗?希望看到该课程的属性。 – Aks

+0

不相关,但为什么你总是创建新的获取结果控制器?添加一个属性'sortDescriptors'并使用'didSet'观察者来更新控制器谓词的'sortDescriptors'并执行一次提取。 – vadian

+0

您是否想在选择分段控制器时对对象进行排序? – Mannopson

添加以下断言只过滤那些恰好搜索文本匹配:

fetchRequest.predicate = NSPredicate(format:"allergen == %@", searchBar.text) 

或者,您可能想匹配,如果allergen字符串包含搜索文本:

fetchRequest.predicate = NSPredicate(format:"allergen CONTAINS %@", searchBar.text) 

为了使对比情况和变音符号不敏感,加[cd](所以... ==[cd] ...Ø r ... CONTAINS[cd] ...)。

+0

这工作!谢谢! – Thejm