Как правильно установить NSPredicate для к - многие отношения при использовании Базовых Данных?

Если Вы знаете, что значения 0 или 1, Вы могли бы сделать flipval ^= 1.

22
задан Massimo Cafaro 28 August 2009 в 15:34
поделиться

2 ответа

Оказывается, это еще одна проблема с отсутствующей и / или несогласованной документацией.

Правильный предикат в этом случае следующий:

[NSPredicate predicateWithFormat:@"(excludedOccurrences.@count == 0) OR (0 == SUBQUERY(excludedOccurrences, $sub, $sub.day == %@).@count)", today]

В предикате подзапрос используется для проверки того, равно ли нулю количество связанных excludedOccurrences с датой, соответствующей дате вашего тестирования. Однако документация вводит в заблуждение. Вот что говорится в Руководстве по программированию предикатов относительно использования предикатов в сочетании с отношениями ко многим.

Использование предикатов с отношениями

Если вы используете отношение ко многим, конструкция предиката немного отличается. Если вы хотите получить отделы, в которых хотя бы один из сотрудников имеет имя, например, «Мэтью», используйте оператор ANY, как показано в следующем примере:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"ANY employees.firstName like 'Matthew'"];

Если вы хотите найти отделы, в которых всем сотрудникам платят больше определенной суммы, используйте оператор ALL, как показано в следующем примере:

float salary = ... ;
NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"ALL employees.salary > %f", salary];
43
ответ дан 29 November 2019 в 04:33
поделиться

Довольно любопытно, как решить эту проблему. Я настроил небольшой проект и создал контекст, который вы используете.

NSDate *today = [NSDate date];
NSMutableArray *objects = [NSMutableArray array];

{
    NSArray *day = [NSArray arrayWithObjects:today, [today dateByAddingTimeInterval:20.0f], nil];
    NSDictionary *excludedDay = [NSDictionary dictionaryWithObject:day forKey:@"day"];
    NSDictionary *object = [NSDictionary dictionaryWithObject:excludedDay forKey:@"excludedDay"];

    [objects addObject:object];
}

{
    NSArray *day = [NSArray arrayWithObjects:[today dateByAddingTimeInterval:20.0f], nil];
    NSDictionary *excludedDay = [NSDictionary dictionaryWithObject:day forKey:@"day"];
    NSDictionary *object = [NSDictionary dictionaryWithObject:excludedDay forKey:@"excludedDay"];

    [objects addObject:object];
}


NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NONE excludedDay.day == %@", today];
NSArray *filtered = [objects filteredArrayUsingPredicate:predicate];

NSLog(@"%@", filtered);

Это дает объект, когда:

  1. Дневной массив пуст
  2. Дневной массив не содержит "сегодня" дату

Это не дает объекту, когда:

  1. Дневной массив содержит "сегодня"
    • Не имеет значения, сколько объектов в дневном массиве
1
ответ дан 29 November 2019 в 04:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: