我有一个功能:
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具有给定类别之一。目前,我的代码无法正常工作,如果有人可以帮助我,我将不胜感激
数据库结构如下:
Garage
:garageNbr
,name
,active
Car
:name
Category
:categoryName
他们有关系:
Garage
:
关系:garageHasCars
目的地:Car
逆:carInGarage
Car
:
关系:carInGarage
目的地:Garage
逆:garageHasCars
Relationship: `carHasCategories`
Destination: `Category`
Inverse: `categoryHasCars`
Category
:
关系:categoryHasCars
目的地:Car
逆:carHasCategories
答案 0 :(得分:2)
如果我正确理解:
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)
应该做这项工作。