Как использовать оператор «IN» с предикатом - PullRequest
3 голосов
/ 04 апреля 2011

Как написать NSPredicate для извлечения строк, соответствующих значениям в массиве? Например:

[NSPredicate predicateWithFormat:@"UserName IN %@",UserIDArray];

Если UserIDArray содержит идентификатор пользователя, как получить имя пользователя, соответствующее значениям в этом массиве?

Ответы [ 2 ]

5 голосов
/ 05 апреля 2011

Позвольте мне начать с этого совета. Базовые данные не являются SQL. Сущности не являются таблицами. Объекты не являются строками. Столбцы не являются атрибутами / свойствами. Базовые данные - это система управления графом объектов, которая может сохранять или не сохранять объектный граф, а может и не использовать SQL для этого далеко за кулисами. Попытка представить базовые данные в терминах SQL приведет к тому, что вы полностью неправильно поймете базовые данные и приведет к большим трудностям и потерянному времени.

Поскольку базовые данные основаны на объектах, при выполнении выборки вы получаете массив объектов. Чтобы найти конкретные значения, вы затем запрашиваете у этих объектов значения их соответствующих атрибутов.

Предположим, у вас есть следующая сущность:

User{
    userName:string
    userID:string
}

... и хотите найти всех пользователей, чьи userName соответствуют массиву строк userID. Вы должны создать NSFetchRequest и установить его сущность на «Пользователь». Тогда вы бы использовали предикат, подобный этому:

[NSPredicate predicateWithFormat:@"userID IN %@",arrayOfUserIDs];

Выборка вернет массив NSManagedObjects (или подкласса), настроенный с ключами имени атрибута объекта User. Чтобы найти значение атрибута userName каждого управляемого объекта в массиве, вы должны запросить у объекта значение его атрибута следующим образом:

NSString *aUserName=[aUserEntityObject valueForKey:@"userName"];

Просто забудьте все, что вы знаете о SQL или аналогичных системах баз данных. Базовые данные на самом деле не являются базой данных, поэтому попытка думать об этом в таких терминах просто смущает вас. Базовые данные - это все об объектах.

1 голос
/ 12 декабря 2014

Вы предикат, это хорошо, но ваши вопросы показывают, что вы не до конца понимаете, что происходит.

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

Что бы я сделал в вашем случае - это извлечение объектов, соответствующих вашему предикату, а затем используйте valueForKey: в полученном NSArray, чтобы получить список имен пользователей.

Предполагая, что у вас есть такая сущность:

User{
    name:string
    identifier:string
}

Код может быть:

NSArray *ids = @[@"a", @"b", @"c"];
NSManagedObjectContext *context = self.managedObjectContext;
NSFetchRequest *userRequest = [[NSFetchRequest alloc] init];
[userRequest setEntity:[NSEntityDescription entityForName:@"User" inManagedObjectContext:context]];
[elementsRequest setPredicate:[NSPredicate predicateWithFormat:@"identifier IN %@", ids]];

NSError *error;
NSArray *result = [context executeFetchRequest:userRequest error:&error];
if (result) {
    NSArray *names = [result valueForKey:@"_id"];
    // names is : @[@"the name of a", @"the name of b", @"the name of c"]
} else {
    // TREAT YOUR ERROR
}
...