Как объединить 2 предиката CoreData в Swift? - PullRequest
0 голосов
/ 07 октября 2018

У меня есть функция:

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

1 Ответ

0 голосов
/ 07 октября 2018

Если я правильно понимаю:

  • Существует отношение один-ко-многим от 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])

Это может быть тем, что «ЛЮБОЙ В» не работает с отношениями «многие ко многим», в этом случае

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

должен выполнить работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...