核心数据的 FetchResults 中的谓词无效

Posted

技术标签:

【中文标题】核心数据的 FetchResults 中的谓词无效【英文标题】:Predicate in FetchResults for Core Data has no effect 【发布时间】:2017-07-04 14:09:41 【问题描述】:

我有一个基本上用于检索数据的 Core Data 应用程序,但是当我应用谓词时,没有过滤。换句话说,无论过滤器如何,都会返回相同的结果。有什么建议么?

lazy var frc: NSFetchedResultsController<Report> =
    
        let context = self.app.persistentContainer.viewContext

        let req: NSFetchRequest<Report> = Report.fetchRequest()
        req.fetchBatchSize = 20


        let sortDescriptor = NSSortDescriptor(key: "status", ascending:true)
        req.sortDescriptors = [sortDescriptor]

        let filter = self.app.currentFilter
        //print(filter!)
        let predicate = NSPredicate(format: "status == %@", filter)
        req.predicate = predicate

        let afrc = NSFetchedResultsController(fetchRequest: req, managedObjectContext: context, sectionNameKeyPath: nil, cacheName: "reports")
        afrc.delegate = self
        do
        
            try afrc.performFetch()
        
        catch
        
            fatalError("Abort while fetching report")
        
        return afrc
()

报告实体的状态属性是String

【问题讨论】:

看看你的//print(filter!) 行,我想你知道这个惰性getter 代码只运行一次。在那之后您要更改filter 吗?那是你得到意想不到的结果的时候吗? 是的。我也尝试使用静态字符串。我可能已经解决了我的问题,但现在我想弄清楚为什么我解决了它。我在模型中添加了一个关系,现在谓词正在工作,但关系不在谓词过滤器项上,我没有更改上面的代码。 【参考方案1】:

跟进上面的两个cmets,或许答案就在Apple documentation for NSFetchedResultsController。阅读修改获取请求部分,特别注意

您不能简单地更改获取请求来修改结果。

【讨论】:

这基本上回答了这个问题,但我仍在苦苦挣扎。我得到不一致的结果。在一个地方我可以修改请求(在我重新阅读文档之前)并且它工作正常 - 到目前为止。我仍然缺少一些东西。在该文档中,它似乎声明如果您不使用缓存,您应该能够随意更改获取请求。我将缓存名称更改为 nil,但结果并不完全符合我的预期。 也许你在一个“工作正常”的地方执行 performFetch() 另外,我想再次指出,您发布的所有代码,包括 ...() 之间的所有内容,都是最多运行一次的闭包一次 i> 在封闭对象/类的生命周期中,初始化 frc。因此,修改 fetch 请求必须在其他地方。

以上是关于核心数据的 FetchResults 中的谓词无效的主要内容,如果未能解决你的问题,请参考以下文章

核心数据谓词 - 检查数组中的任何元素是不是与另一个数组中的任何元素匹配

作为获取谓词的日期范围 - 核心数据之间的 NSDate 谓词

核心数据中的谓词和组合过滤器?

比较 Fetchrequest Xcode Swift OSX 核心数据的谓词中的 NSSet

核心数据获取请求中需要谓词?

子查询谓词核心数据