NSPredicate для проверки свойства первых 5 объектов в Core Data Relationship - PullRequest
0 голосов
/ 27 сентября 2018

Я хочу создать предикат, который может проверять TypeID первых 5 объектов в Core Data отношении.

Вот что я пытаюсь, но это не работает:

int num = 5;
NSMutableArray *predicates = [[NSMutableArray alloc] init];
for (int i = 0; i < num; i++) {

    [predicates addObject:[NSPredicate predicateWithFormat:@"SELF IN %@ AND logs[%i].TypeID == 3", items, i]];

}

Это дает ошибку:

ошибка: SQLCore dispatchRequest: запрос обработки исключения: , Журналы выражений неподдерживаемых функций [0] .TypeID с userInfo ((null) CoreData: ошибка: SQLCore dispatchRequest: запрос на обработку исключения: , Журналы выражений неподдерживаемых функций [0] .TypeID с userInfo (null)

Я понимаю, что, вероятно, делаю этонеправильно, так есть ли другой способ, которым я мог бы сделать это, используя NSPredicate?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

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

Однако, и я думаю, что это может быть то, к чему вы пришли, возможно можно найти пять объектов, которые оба находятся в наборе items и имеют хотя бы один logс typeID == 3.Это можно сделать аналогично предложению E.Coms, за исключением того, что вам нужен подзапрос для обработки отношений.(Я предполагаю, что журналы - это отношение «многие ко многим», «один ко многим» или «многие ко многим»).

Обратите внимание, что следующий код не был протестирован:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity name" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@ AND SUBQUERY(logs, $log, $log.typeID == 3).@count != 0", items];
[fetchRequest setPredicate:predicate];
fetchRequest.fetchLimit = 5;
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {

}
0 голосов
/ 27 сентября 2018

, если вы хотите только выборку 5. Установите fetchLimit на 5. Возможно, следующий код не может быть запущен сразу, но принцип тот же.Вы можете добавить свойство или функцию get для назначения «logs.TypeID», например - (Int) myID {return logs [0] .TypeID;}, а затем «SELF IN% @ AND myID == 3» решит проблему.

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Entity name" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@ AND logs.TypeID == 3", items];
[fetchRequest setPredicate:predicate];
fetchRequest.fetchLimit = 5;
NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {

}
...