在 Swift 中使用 NSPredicate 显示 CoreData 的结果

Posted

技术标签:

【中文标题】在 Swift 中使用 NSPredicate 显示 CoreData 的结果【英文标题】:Display results from CoreData using NSPredicate in Swift 【发布时间】:2015-07-10 00:19:31 【问题描述】:

我的viewDidLoad()中有以下代码

    fetchedResultsController = NSFetchedResultsController(fetchRequest: FetchRequest("Teams", key: "team_name"), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil)
    fetchedResultsController?.delegate = self
    fetchedResultsController?.performFetch(nil)

我的 TableView cellForRowAtIndex 中的这段代码:

        var cell = teamView.dequeueReusableCellWithIdentifier("team_cell", forIndexPath: indexPath) as! TeamCellSettings

        if let cellContact = fetchedResultsController?.objectAtIndexPath(indexPath) as? Team 
            //create cell here
        

    return cell

我已在线阅读有关如何使用 NSPredicate 的信息,但我似乎无法让它发挥作用。我的目标是使用分段控件根据行属性的内容在 UITableView 中显示的结果之间进行切换。因此,如果我的实体 X 有一个名为 A 的属性,A 将存储 1 或 0,所以基本上我需要分段控件在 all 包含 1 的结果之间切换在A 属性中或A 属性中为0

我的创意写作技巧不是最好的。希望你能理解我的目标。谢谢。

【问题讨论】:

【参考方案1】:

fetch请求中需要添加谓词,例如:

let request = NSFetchRequest(entityName: "Your entity name")
let predicate = NSPredicate(format: "A == %d", 1)
request.predicate = predicate

fetchedResultsController = NSFetchedResultsController(
  fetchRequest: request, 
  managedObjectContext: managedObjectContext!, 
  sectionNameKeyPath: nil, 
  cacheName: nil)

谓词的内容取决于您的目标。在下一步中,您需要在更改分段控件中的选定项目时更新获取请求并重新加载数据。在分段控件更改时调用的IBAction 中,获取sender.selectedSegmentIndex 并根据索引创建新谓词。 要重新获取的代码将如下所示: 斯威夫特 2

        fetchedResultsController.fetchRequest.predicate = NSPredicate(format: "A = %d", some_int_goes_here)
        do 
            try fetchedResultsController.performFetch()
        
        catch let error as NSError 
            NSLog("%@", error.localizedDescription)
        
        catch 
            fatalError()
        
        tableView.reloadData()

如果你做 Swift 1.2,省略错误处理,当然是这样的:

fetchedResultsController.fetchRequest.predicate = NSPredicate(format: "A = %d", some_int_goes_here)
fetchedResultsController.performFetch()
tableView.reloadData()

【讨论】:

感谢您的帖子!您的代码适用于我面临的谓词问题。但是,您能否帮助我使用分段控件重新获取我的请求,因为我已经尝试了几种方法并且请求不会重新获取 新添加的代码抛出各种错误。告诉我在“try”和“fetchedresultscontroller.performfetch() 等之间插入一个分号。我不知道如何使用它。我正在使用 XCode 6.3。 对。这是一个 Swift 2 代码。在我的回答中查看旧版本 Swift 的更新。

以上是关于在 Swift 中使用 NSPredicate 显示 CoreData 的结果的主要内容,如果未能解决你的问题,请参考以下文章

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

Swift NSPredicate SUBQUERY with NOT IN?

在 Swift 中使用 NSPredicate 对 CoreData 结果进行排序

在 Swift 中使用 NSPredicate 时的 EXC_BAD_ACCESS

使用 NSPredicate 在单个搜索 iOS swift 中搜索多个单词

我如何在单个提取请求中调用两个 NSPredicate。核心数据 iOS Swift