【问题标题】:Nesting fetch requests嵌套获取请求
【发布时间】:2016-02-18 12:59:51
【问题描述】:

在我的项目中,我有两个实体:personEntitymunicipalEntity。它们之间具有多对多的反比关系。我在personEntity 上执行NSFetchRequest 以获取某人的详细信息:

    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
    let context = appDelegate.managedObjectContext
    let personRequest = NSFetchRequest(entityName: "personEntity")
    let personPred = NSPredicate(format: "surname = %@", "Smith")
    personRequest.predicate = personPred
    do {
        let personsList = try context.executeFetchRequest(personRequest)
        // this all clear enough up to this point

此时,我尝试在第一个中嵌套第二个,谓词FetchRequest。此请求应在其peopleInMunicipality 关系属性中搜索municipalEntity,以查找来自personsList 的对象。

        for selectedPeople in personsList {
            let municipalRequest = NSFetchRequest(entityName: "municipalEntity")
            let municipalPred = NSPredicate(format: "peopleInMunicipality = %@", selectedPeople)
            municipalRequest.predicate = municipalPred
            do {
                let municipalitiesWithResidentsCalledSmithList = try context.executeFetchRequest(municipalRequest)

然后砰...编译器抱怨并建议我需要更改定义第二个谓词的行中的两件事。它建议...

            let municipalPred = NSPredicate(format: "peopleInMunicipality = %@", argumentArray: selectedPerson as? [AnyOject])

编译器现在很高兴,但是当我运行代码时,它在建议的 argumentArray: 代码部分出现 EXC_BAD_ACCESS 错误并崩溃。 知道如何解决这个问题吗?

【问题讨论】:

  • 也许我错了,但是如果您有多对多关系,则每个实体中都有一个属性引用另一个实体。过滤人员后,您可以从每个人的提及属性中检索关联的 municipalEntity 项。
  • 这几乎就是我想要做的。如果一个实体有一个属性,我可以运行一个谓词(就像在第一个循环中一样)。如果属性是关系,则同样的方法也应该适用。我缺少将实体关系中的对象与参考对象进行比较的语法。 "Object =%@" 可能是错误的方法。
  • 明确一点:实体具有属性。属性可以是属性或关系。 vadian 表示属性,表示关系。
  • 这也是我阅读 Vadian 评论的方式。
  • 对,我混淆了术语,我的意思是关系

标签: swift core-data relationship nspredicate


【解决方案1】:

vadian 是对的。您不需要第二个获取请求。如果peopleInMunicipality的反向关系称为municipalities,则selectedPeople的直辖市为selectedPeople.municipalities

如果你真的想执行第二个获取请求,谓词格式应该是peopleInMunicipality CONTAINS %@

【讨论】:

  • 好的。我还没有尝试过。我找到了如何让我的代码工作。定义嵌套谓词的行是:... let urbanPred = NSPredicate(format: "peopleInMunicipality = %@", selectedPeople as!NSManagedObject)
  • 您确定peopleInMunicipality 是一对多关系吗?
【解决方案2】:

因为我无法发表评论。您可以像这样在 MunicipalEntity 上尝试 SubQuery:

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(peopleInMunicipality, $person, $person.surname == %@).@count > 0", @"Smith"];

在市政实体上使用这个谓词

【讨论】:

  • 或者只是没有子查询ANY peopleInMunicipality.surname = %@
猜你喜欢
  • 2020-01-17
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2014-05-31
  • 2018-09-01
  • 1970-01-01
相关资源
最近更新 更多