Swift NSP предикат SUBQUERY с NOT IN? - PullRequest
0 голосов
/ 04 октября 2019

Можно ли использовать «NOT IN» в NSP-предикате с SUBQUERY?

В «обычном» NSP-предикате это работает:

NSPredicate(format: "NOT (uid IN %@)", uids)

Однако я пытаюсьэтот синтаксис «НЕ В» в NSP-предикате с SUBQUERY, и он не работает (но и не падает):

NSPredicate(format:"SUBQUERY(forests.treeFamily, $tree, NOT ($tree._id IN %@)) .@count > 0", arrayOfTreesIds)

Хотя следующий синтаксис «В» работает нормально:

NSPredicate(format:"SUBQUERY(forests.treeFamily, $tree, $tree._id IN %@) .@count > 0", arrayOfTreesIds)

Есть идеи, как мне этого добиться?


ОБНОВЛЕНО

Ответ, полученный от Джея, заставил меня думать, что я недостаточно ясносхема / класс.

Итак, давайте сделаем пример с собаками.

У нас есть ShelterClass, у которого есть свойство Dogs. Это массив объектов Dog, чтобы отслеживать, какие собаки находятся в приюте.

У класса Dog есть свойство "race", которое является ссылкой на класс Race.

Я хочу отфильтровать приюты, в которых нет определенных пород собак. Хотя я бы использовал это для фильтрации Убежищ, у которых есть определенные расы собак:

NSPredicate(format:"SUBQUERY(dogs.race, $race, $race._id IN %@) .@count > 0", arrayOfRaceIds)

Я не могу найти, как отфильтровать / использовать синтаксис «НЕ В».

1 Ответ

1 голос
/ 04 октября 2019

Супер просто! Вот формат для обычного фильтра

Если у вас есть DogClass

class DogClass: Object {
   @objc dynamic var name = ""
}

, а затем вам нужен список собак, которые не названы Dino и Fido, вот код

 let dogNames = ["Fido", "Dino"]
 let results = realm.objects(DogClass.self).filter("NOT dog_name IN %@", dogNames)

Результат подзапроса будет зависеть от того, какой результат вы ожидаете и для чего предназначен подзапрос.

Например, скажем, у нас есть PersonClass, у которого есть свойство dog, которое являетсяСписок собак, которых они знают. Если мы хотим, чтобы все люди, которые не знают Фидо или Дино, это запрос

let personResults = realm.objects(PersonClass.self).filter("NOT ANY dogs.dog_name in %@", dogNames)

РЕДАКТИРОВАТЬ

На основе обновленного вопроса, давайте попробуем это. Так как я использовал PersonClass в вышеупомянутом, я задам этот вопрос.

Я хочу получить список всех людей (Убежищ), которые не имеют породы (расы) Гончей. Вот класс Breed для отслеживания пород

class BreedClass: Object {
    @objc dynamic var breed = ""
}

и DogClass, который обладает свойством породы (например, "Раса" в вопросе)

class DogClass: Object {
    @objc dynamic var dog_id = NSUUID().uuidString
    @objc dynamic var dog_name = ""
    @objc dynamic var dog_breed: BreedClass?

    override static func primaryKey() -> String? {
        return "dog_id"
    }
}

и, наконец,Класс Person, у которого есть список объектов DogClass

class PersonClass: Object {
    @objc dynamic var person_id = UUID().uuidString
    @objc dynamic var first_name = ""

    let dogs = List<DogClass>()

    override static func primaryKey() -> String? {
        return "person_id"
    }
}

Затем у нас есть несколько населенных объектов породы

let b0 = BreedClass()
b0.breed = "Mut"

let b1 = BreedClass()
b1.breed = "Poodle"

let b2 = BreedClass()
b2.breed = "Hound"

, а затем мы добавляем породы в собак и добавляем собак в этих людей. В этом случае у нас будет только одна собака b2, гончая

let d2 = DogClass()
d2.dog_name = "Sasha"
d2.dog_breed = b2

. В этом случае я добавила 4 человек, Берт, Эрни, Гровер и Граф. Эрни был единственным человеком, к которому я добавил собаку.

Наконец запрос, который вернет всех людей, которые НЕ имеют породы собак.

let breed = "Hound"
let personResults = realm.objects(PersonClass.self).filter("NOT ANY dogs.dog_breed.breed == %@", breed)
for person in personResults {
    print(person.first_name)
}

и вывод

Bert
Grover
The Count

И Эрни пропал, потому что у него есть гончая.

...