【问题标题】:Simple Core Data fetch for to-many relationship对多关系的简单核心数据获取
【发布时间】:2020-01-03 21:34:20
【问题描述】:

鉴于 Dogs 和 Owners 之间是一对多的关系,即

(Owner)
@NSManaged public var dogs: NSSet?

(Dog)
@NSManaged public var owners: NSSet?

我有一个返回 Dogs 的 DogProvider 类。它默认返回所有 Dogs。但是在我给 DogProvider 一个所有者的情况下,我如何在 NSFetchedResultsController 中只返回该所有者的狗?我知道以下方法不起作用 (Cannot convert value of type 'Owner?' to expected argument type '[Any]?') 但这是我的最新尝试。

let fetchRequest: NSFetchRequest<Dog> = Dog.fetchRequest() //return all dogs by default
if let owner = self.owner {
    fetchRequest.predicate = NSPredicate(format: "owner = %@", argumentArray: self.owner)
}

【问题讨论】:

  • 您可以像访问任何其他属性一样访问关系,例如 owner.dogsdog.owner
  • 我明白,但视图控制器期待dogProvider.fetchedResultsController.fetchedObjects
  • 如果你有一个 Owner 对象,那么你不需要执行获取,如果你有一个 owner 对象,则返回 owner.dogs。 dogs 是一个 Set 所以你可能需要做 Array(owner.dogs) 如果你需要返回一个像 fetchedObjects 这样的数组
  • argumentArray 是一个数组。试试argumentArray: [owner]

标签: swift core-data nspredicate nsfetchedresultscontroller nsfetchrequest


【解决方案1】:

您使用了错误的 API。 argumentArray 用于多个占位符,其中数组中的项目数必须与占位符的数量匹配,例如

let parameters = [foo, bar, baz]
fetchRequest.predicate = NSPredicate(format: "foo = %@ AND bar = %@ AND baz = %@", argumentArray: parameters)

只需要搜索 owners contains owner,在安全解包后使用 self.owner 作为参数是一个非常糟糕的主意

if let owner = self.owner {
   fetchRequest.predicate = NSPredicate(format: "owners CONTAINS %@", owner)
}

【讨论】:

    【解决方案2】:

    正如@willeke 在 cmets 中所说,argumentArray: 参数需要一个数组。但您的谓词也需要稍有不同,因为关系是多对多的:

    let fetchRequest: NSFetchRequest<Dog> = Dog.fetchRequest() //return all dogs by default
    if let owner = self.owner {
        fetchRequest.predicate = NSPredicate(format: "ANY owner = %@", argumentArray: self.owner)
    }
    

    注意“ANY”修饰符。

    【讨论】:

      猜你喜欢
      • 2014-07-10
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      • 1970-01-01
      相关资源
      最近更新 更多