如何使用NSPredicate Swift获取核心数据并对其进行过滤

时间:2016-04-19 01:37:20

标签: ios swift core-data nspredicate

我目前正在学习并创建一个基本的决策应用。该应用程序的基础是为用户输入他们想要做的类别,然后是所有想要填充该类别的东西。

现在我想在一个有效的表视图上显示结果,但我还要点击他们最近使用的每个类别,并能够看到他们放在任何类别下的内容。我收到了保存到Core Data的所有内容,但现在我正在尝试使用NSPredicate来过滤掉我需要的东西。当我运行App时,表视图中没有任何内容。

mainName我从另一个视图控制器传入以捕获并设置该类别的名称以帮助过滤数据。我试图在谓词中使用它作为过滤器。

我不知道我在做什么是正确的,但帮助会很棒。这是我正在做的独立学习项目,以帮助完成我的学位,到目前为止,我所知道的一切都是自学。如果我有什么是完全错误请告诉我。这只是我试图做到这一点的数百种不同方式中的一种。

@IBOutlet weak var tableview: UITableView!


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return whats.count


}
 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("cell")! as UITableViewCell

    let Doing = whats[indexPath.row]
    cell.textLabel!.text = Doing.valueForKey("what") as? String


    return cell
}

 func loadData(){


    let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate

    if let context = appDelegate?.managedObjectContext{

        let fetchRequest = NSFetchRequest(entityName: "Doing")
        let namePredicate = NSPredicate(format: "namesR.noun = '\(mainName)'")
        (whats as NSArray).filteredArrayUsingPredicate(namePredicate)
        fetchRequest.predicate = namePredicate
        do {
           let results =
                try context.executeFetchRequest(fetchRequest)
            whats = results as! [NSManagedObject]
        } catch let error as NSError {
            print("Could not fetch \(error), \(error.userInfo)")
        }
    }
}

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

}

override func viewDidLoad() {
    super.viewDidLoad()

    loadData()
}

2 个答案:

答案 0 :(得分:0)

如果您想在基于Core Data的应用中使用tableView?您可以使用NSFetchedResultsController类及其delegate协议方法。此课程专为tableView设计!

Official Documentation for NSFetchedResultsController class

答案 1 :(得分:0)

根据我的理解,你说你有一个Category实体和一个Item实体,每个Category都有很多Item。在这种情况下,在要显示Items的视图控制器中,您需要在谓词中使用Category变量,以便只返回与该Category关联的Items。

class ItemsTableVC {

    var category: Category!

    lazy var fetchedResultsController: NSFetchedResultsController = {
        let fetchRequest = NSFetchRequest(entityName: "Item")
        fetchRequest.sortDescriptors = []
        fetchRequest.predicate = NSPredicate(format: "category == %@", self.category)
        let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.sharedContext, sectionNameKeyPath: nil, cacheName: nil)
        fetchedResultsController.delegate = self
        return fetchedResultsController
    }()

}