NSPredicate для длины строкового атрибута NSManagedObject

Может кто-нибудь помочь мне определить предикат, который возвращает только NSManagedObject, чья длина атрибута "letters" находится в определенном диапазоне?

Вот пример, который я пробовал, у меня такое ощущение, что это нотации letter.length, я также пробовал буквы kvc. @ Length без успеха. Что я делаю не так?

NSManagedObjectContext *context = ...;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Word" inManagedObjectContext:context];
[fetchRequest setEntity:entity];

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"letters" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"letters.length BETWEEN %@", [NSArray arrayWithObjects: [NSNumber numberWithInt:5], [NSNumber numberWithInt:20], nil]];
[fetchRequest setPredicate:predicate];

NSUInteger limit = 20;
[fetchRequest setFetchLimit:limit];

NSError *error = nil;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];

4 ответа

Решение

Не знаю, как этот фрагмент кода влияет на производительность, но вот мой ответ на ваш вопрос:

NSString *attributeName = @"letters";
NSString *attributeValue = [NSString stringWithFormat:@".{%d,%d}", 5, 20];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K MATCHES %@", attributeName, attributeValue];
[fetchRequest setPredicate:predicate];

Джосс.

У меня плохие новости. Вы не можете сделать это. В NSPredicate отсутствует атрибут длины для строк (который я смог найти).

То, что я бы порекомендовал вам сделать, это добавить атрибут для длины хранимой строки в вашем управляемом объекте, который устанавливается при установке атрибута letters. Затем вы можете выполнить запрос по этому атрибуту и ​​вернуть нужные значения.

Если кто-то ищет способ проверить, имеет ли строка длину с использованием NSPredicate, это возможно.

Быстрый:

возвращает строки от 4 до 7 символов.

      NSPredicate(format: "text MATCHES %@", ".{4,7}")
Другие вопросы по тегам