核心数据的 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 谓词