首页 > 解决方案 > 如何在 Swift 中组合 2 个 CoreData 谓词?

问题描述

我有一个功能:

open func getAllCarsCount(from garages: [Garage], with categories: Set<Category> = []) -> Int {
    var returnCount = 0
    let context = DBContext.defaultContext

    var predicates = [NSPredicate]()
    for category in categories {
        let predicate = NSPredicate(format: "SUBQUERY(carHasCategories, $c, $c.categoryName == %@ ).@count > 0", category.categoryName)
        predicates.append(predicate)
    }

    for garage in garage {
        let predicate = NSPredicate(format: "garageNbr = \(garage.garageNbr) AND active = 1" )
        predicates.append(predicate)
    }

    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Car")
    request.predicate = NSCompoundPredicate(orPredicateWithSubpredicates: predicates)

    do {
        let count = try context.count(for: request)
        returnCount += count
    } catch let error as NSError {
        print("Could  not get all cars count. ", error.localizedDescription)
    }

    return returnCount
}

在其中我试图获得一些具有给定之一的汽车categories。但我需要结合 2 个谓词。所以我想要的是:

要从garages它们所在的给定数组中获取所有汽车的数量activegarageNbr匹配并且具有给定类别之一。目前我的代码无法正常工作,如果有人可以帮助我,我将不胜感激

数据库结构如下所示:

Garage: garageNbr, name,active

Carname

CategorycategoryName

他们有关系:

Garage: 关系:garageHasCars 目的地:Car 逆:carInGarage

Car: 关系:carInGarage 目的地:Garage 逆:garageHasCars

Relationship: `carHasCategories`
Destination: `Category`
Inverse: `categoryHasCars`

Category: 关系:categoryHasCars 目的地:Car 逆:carHasCategories

标签: iosswiftcore-data

解决方案


如果我理解正确:

  • Garage从到有一对多的关系Car
  • Category从到有一个多对多的关系Car

你想计算所有的汽车

  • 属于给定的车库之一(应该是活动的),并且
  • 具有给定的一组类别中的至少一个类别。

第一个请求可以用

let p1 = NSPredicate(format: "carInGarage.active = TRUE AND carInGarage IN %@", garages)

第二个是

let p2 = NSPredicate(format: "ANY carHasCategories IN %@", categories)

以及与

let p = NSCompoundPredicate(andPredicateWithSubpredicates: [p1, p2])

在这种情况下,“ANY IN”可能不适用于多对多关系

let p2 = NSPredicate(format: "SUBQUERY(carHasCategories,$c,$c IN %@").@count > 0, categories)

应该做的工作。


推荐阅读