代码之家  ›  专栏  ›  技术社区  ›  J. Doe

如何在Swift中组合两个CoreData谓词?

  •  2
  • J. Doe  · 技术社区  · 7 年前

    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 匹配并且具有给定类别之一的。目前我的代码不能正常工作,如果有人能帮助我,我将不胜感激

    数据库结构如下所示:

    Garage , name 积极的

    Car : 名称

    Category categoryName

    他们有关系:

    : 关系: garageHasCars 目的地: 小型车 carInGarage

    小型车 : 目的地: 车库 车库有汽车

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

    类别 : 关系: categoryHasCars 目的地: 小型车 carHasCategories

    1 回复  |  直到 7 年前
        1
  •  4
  •   Martin R    7 年前

    如果我理解正确:

    • 这里有一对多的关系 Garage 到 Car
    • 这是一种多对多的关系 Category 到 小型车

    你想数一数

    • 属于给定车库之一(应处于活动状态),以及

    第一个请求可以用

    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])
    

    可以 任何一种都不适用于多对多的关系,

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

    我应该做这项工作。