Я использую основные данные в своем проекте некоторое время. Несколько дней назад я обнаружил, что некоторые записи, сохраненные в базе данных, не отображаются в пользовательском интерфейсе приложения. Я отследил его и обнаружил, что их вообще не выбирают, когда я отфильтровываю пустую строку с помощью NSPredicate. И все они начинаются с неалфавитных символов.
Чтобы прояснить проблему, я создал образец проекта и добавил несколько выборочных данных в базу данных. Скажем, это "Образец", "+ образец", "Образец +".
Здесь фрагмент кода, который я использовал для фильтрации пустой строки. "text" - это имя свойства string, а moc - экземпляр NSManagedObjectContext.
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"BasicEntity"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"text.length > 0"];
[request setPredicate:predicate];
NSArray *samples = [moc executeFetchRequest:request error:&error];
Массив результатов содержит только 2 объекта, которые являются "Sample" и "Sample +".
Я даже пробовал один и тот же предикат (конечно, используя self.length вместо text.length) на простой массив, содержащий выше пример строк, и я правильно все 3.
Интересно, кто-то испытал такую же проблему. Или я что-то пропустил в использовании Core Data? Протестировано на симуляторе iOS 7.0.3 и 7.0.6 iPad Air.
UPDATE: как было сказано в другом потоке, я решил эту проблему, используя регулярное выражение.
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"text MATCHES %@", @".{1,}"];
Тем не менее, я считаю, что исходный предикат, который я использовал, является допустимым. Я напишу ошибку Apple, чтобы узнать их мнение.