【问题标题】:CoreData NSFetchedResultsController of all objects based on a sibling one-to-many relationship property基于同级一对多关系属性的所有对象的 CoreData NSFetchedResultsController
【发布时间】:2018-08-28 13:24:57
【问题描述】:

我有一个包含类别、状态和项目实体的模型(由于某种原因它很大):

我想维护一个包含所有 Category 对象的 NSFetchedResultsController,这些对象至少有一个状态为“open”或“purchased”的 Item。我已经广泛搜索,可以找到大量 CoreData 到多关系线程,但似乎找不到这样的东西。

我需要谓词干预 - 我的当前抛出异常是因为我试图非法使用多对多关系:

'NSInvalidArgumentException', reason: 'to-many key not allowed here'

这是我现在的代码(糟糕的代码,糟糕!):

lazy var searchHeaderController: NSFetchedResultsController<Category> = {

    let request = Category.createFetchRequest()

    request.predicate = NSPredicate(format: "items.status.name == 'open' || items.status.name == 'purchased'")

    let sort = NSSortDescriptor(key: "sortOrder", ascending: true)
    request.sortDescriptors = [sort]

    let fetchedResultsController = NSFetchedResultsController(fetchRequest: request, managedObjectContext: mainContext, sectionNameKeyPath: "sortOrder", cacheName: nil)

    do {
        try fetchedResultsController.performFetch()
    } catch {
        fatalError("Big bummer yo! Error with performFetch in searchHeaderController()  Error:  \(error)")
    }

    return fetchedResultsController

}()

感谢您的帮助!

【问题讨论】:

  • 尝试使用ANYIN 关键字。 developer.apple.com/library/archive/documentation/Cocoa/… 。如“status.name == ‘open’ IN items”
  • 如上所述,您的谓词应该是由 2 个组成的 NSCompoundPredicate,它们的格式应为:“ANY items.status.name == open”,删除字符串周围的单引号
  • 感谢 cmets - 我现在使用的是 NSCompoundPredicate,它适用于第一次提取,但它无法与上下文保持同步。我可以在这里发布代码还是从技术上讲这是一个新问题?再次感谢

标签: ios swift core-data one-to-many nsfetchedresultscontroller


【解决方案1】:

在您的谓词中使用 ANY 关键字(如 cmets 中所述)将为您提供一个有效的 FetchRequest,它将获得正确的结果 - 最初。

FetchedResultsController 只会监视Category 对象,因此不会注意到Item 对象的任何变化。

解决方案是在Category 对象中维护一个额外的字段来帮助 FRC。如果有任何物品已打开或已购买,则设置 FRC 可以监控更改的标志。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2013-07-21
    相关资源
    最近更新 更多