Использование NSPredicate для сопоставления со списком целых чисел

#objective-c #core-data

#objective-c #ядро-данные

Вопрос:

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

Я использую это:

 [NSPredicate predicateWithFormat:@"myIntValue IN {1,2,3,4}"]
  

но это возвращает только строки, где myIntValue равно 1.

Что я делаю не так?

Ответ №1:

Это работает:

 NSFetchRequest *request = [[NSFetchRequest alloc] init];

NSArray *idList = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],
                                            [NSNumber numberWithInt:2],
                                            [NSNumber numberWithInt:3],
                                            [NSNumber numberWithInt:4],
                                            nil];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"idealForId IN $IDLIST"];
request.predicate = [predicate predicateWithSubstitutionVariables:
    [NSDictionary dictionaryWithObject:idList forKey:@"IDLIST"]];
  

Комментарии:

1. Core Data хранит только объекты, поэтому вам всегда приходится преобразовывать скаляры в объекты при создании предикатов.

Ответ №2:

Вы пробовали это?

 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"myIntValue IN %@",
[NSArray arrayWithObjects:@"1", @"2", @"3", @"4", nil]];
  

Здесь может быть полезна документация.

Комментарии:

1. Я считаю, что это может сработать для строк, но, похоже, это не работает для целых чисел. Я попробовал [NSNumber numberWithInt: 1] вместо @»1″, но это тоже не сработало.

2. @»1″ — это NSString, @1 — это NSNumber

Ответ №3:

Я не знаю, изменилось ли это с момента первоначальной публикации вопроса, но я получаю точно такой же предикат из всех трех из них.

 [NSPredicate predicateWithFormat:@"myIntValue IN {1, 2, 3, 4}"];

[NSPredicate predicateWithFormat:@"myIntValue IN {%d, %d, %d, %d}", 1, 2, 3, 4];

[NSPredicate predicateWithFormat:@"myIntValue IN %@", @[@1, @2, @3, @4]];
  

Поэтому нет необходимости оборачивать все в объекты.