ios - 如何在 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
它们所在的给定数组中获取所有汽车的数量active
,garageNbr
匹配并且具有给定类别之一。目前我的代码无法正常工作,如果有人可以帮助我,我将不胜感激
数据库结构如下所示:
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
解决方案
如果我理解正确:
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)
应该做的工作。
推荐阅读
- javascript - Jquery Ajax 在成功正文中没有返回任何响应
- flutter - 在 AWS Device Farm、Saucelabs、Firebase 测试实验室等中运行 Flutter 集成测试
- r - 将阵列提升到不同的权力
- scala - 使用 spark/scala 从 hdfs 读取 csv
- r - 用于汇总数据框的自动更新标准
- java - 如何避免从某个网络外部对 Java Web Application servlet 的请求?
- php - MySQL 表中具有 SQL 更新列的列行的数组
- javascript - Vue cli 3 显示来自 package.json 的信息
- sql - 如何连接到 ODBC Oracle 数据库?
- java - 将 Java 8 应用程序移植到 Java 11