Предикат Core Data: нереализованная генерация SQL для предиката

В основном я получил 3 объекта в моей модели данных: Brand, Model и Trim.

  • Бренд имеет отношения «один ко многим» с моделью под названием «модели». (у одной марки есть несколько моделей, но модель имеет только одну марку)
  • Модель имеет отношение «многие ко многим» с Trim, называемое «обрезки». (модель может иметь несколько планок, а отделка может иметь несколько моделей)

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

Итак, вот мой предикат для запроса на выборку:

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Brand"]; [NSPredicate predicateWithFormat:@"ANY models.trims IN %@", arrayOfTrims]; 

И вот ошибка, которую я получаю:

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'unimplemented SQL generation for predicate : (ANY models.trims IN {<Trim: 0x8e60340> (entity: Trim; id: 0x8e62f10 <x-coredata://BCD28560-AED5-4409-9A35-1925001773E6/Trim/p8> 

Я новичок в Core Data, и я понятия не имею, что я делаю неправильно.

Надеюсь, кто-то может помочь,

Большое спасибо.

«ЛЮБОЙ» в предикате Core Data работает только для отношений « один -много». Поскольку ваш запрос включает отношения « два -много», вы должны использовать SUBQUERY:

 [NSPredicate predicateWithFormat:@"SUBQUERY(models, $m, ANY $m.trims IN %@)[email protected] > 0", arrayOfTrims]; 

Когда вы используете предикат в операции CoreData, предикат переводится в SQL. Этот перевод невозможен для всех операций NSPredicate, вы попали в тот, который нет. Мое предложение было бы чем-то вроде:

 NSMutableArray* predicates = [NSMutableArray new]; for(NSString* trim in arrayOfTrims) { [predicates addObject:[NSPredicate predicateWithFormat:@"%@ IN models.trims", trim]]; } NSPredicate* predicate = [NSCompoundPredicate orPredicateWithSubpredicates:predicates]; 

Ключевое слово IN может использоваться, но вы не можете применять ЛЮБОЙ, в то время как это не имеет смысла, когда вы превращаете его в SQL.

Предикат, который вы, скорее всего, ищете:

 [NSPredicate predicateWithFormat:@"models.trims IN %@", arrayOfTrims]; 

Но это не будет работать в этом случае либо потому, что вы переходите через отношения. Итак, что вам нужно сделать, это обратить вспять все:

 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Model"]; [request setPredicate:[NSPredicate predicateWithFormat:@"trims in %@", arrayOfTrims]]; NSError *error = nil; NSArray *modelArray = [moc executeFetchRequest:request error:&error]; if (!modelArray) { NSLog(@"Error: %@\n%@", [error localizedDescription], [error userInfo]); } NSArray parentObjectArray = [modelArray valueForKey:@"${PARENT_RELATIONSHIP_NAME}"]; 

В основном вы извлекаете дочерние объекты для удовлетворения вашего ANY а затем используете KVC для извлечения родительских объектов, которые вам интересны.

Это исключение также возникает, если один из предикатов использует имя столбца (то есть имя поля), которого не существует. Полностью вводящее в заблуждение сообщение об ошибке …

  • Как использовать базовые данные для инъекций зависимостей
  • MagicalRecord saveInBackgroundWithBlock fetch возвращает поврежденные объекты
  • Хранить изображения в sqlite или просто ссылки на него?
  • Перенос и конфигурации основных данных
  • Как получить все записи с базы CoreData с помощью NSManagedObjectSubClass?
  • UIManagedDocument с NSFetchedResultsController и фоновым контекстом
  • Понимание вложенных контекстов в основных данных
  • UITableView endUpdates занимает очень много времени, когда обновления CoreData
  • Сортировка по имени объекта в NSFetchRequest
  • Создание NSPredicate на основе функции SQL IN () для основных данных
  • Объект самонаводящих данных в CoreData
  • Interesting Posts

    Текст SKLabelNode исчезает с использованием iOS 7.1

    Предотвращение отклонения UIAlertController

    Когда и как правильно деактивировать сеанс аудио?

    Как перечислить (почти) все emojis в Swift для iOS 8 без использования каких-либо форм таблиц поиска?

    iOS, насколько большой может быть NSSet / NSArray / NSDictionary?

    Как снизить скорость интернета

    Перетаскивание аннотаций вызывает многократное инициирование метода делегирования состояния перетаскивания

    Автоматическое связывание поставляется … GooglePlaces и GoogleMapsBase … не dylib

    Ошибка gpus_ReturnNotPermittedKillClient, сбрасываемая с помощью MKMapView, когда приложение подсвечено

    Приложение потеряло контроль над локальными уведомлениями после обновления с App Store

    EXC_BAD_ACCESS SKPhysicsWorld

    Цель c – ios: Как выбрать видео из Camera Roll?

    iOS 8 – Заставка экрана после отклонения контроллера просмотра с пользовательской презентацией

    Загрузка веб-представления занимает больше времени с ASIHTTPRequest в ios

    Девять против cocos3d

    Давайте будем гением компьютера.