如何在Swift中合并2个CoreData谓词?

时间:2018-10-07 13:57:56

标签: ios swift core-data

我有一个功能:

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之一的汽车。 但是我需要结合两个谓词。所以我想要的是:

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

数据库结构如下:

GaragegarageNbrnameactive

Carname

CategorycategoryName

他们有关系:

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

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

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

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

1 个答案:

答案 0 :(得分:2)

如果我正确理解:

  • GarageCar存在一对多的关系,
  • CategoryCar存在多对多关系,

您要计算所有哪些汽车

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

第一个请求可以通过

完成
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)

应该做这项工作。