Основные предикаты данных — в чем выгода?

#core-data #nspredicate #fetchrequest

#основные данные #nspredicate #fetchrequest

Вопрос:

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

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

 „myProperty == @d“
 

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

Это, по крайней мере, мое понимание (что, вероятно, является недоразумением), и это меня так раздражает, что я хотел попросить совета или совета по этой теме.

Комментарии:

1. Теперь, когда с %K #keyPath() все в порядке, неясно, спрашиваете ли вы об этом, но реальное преимущество заключается в том, что фильтр находится внутри запроса, и поэтому вы не извлекаете все («ничего»), а извлекаете только необходимое.

2. Спасибо, да, это очевидное преимущество, и у меня уже есть реализации в изолированной среде, которые используют кучу предикатов (на данный момент все в одной строке). В самом начале я предположил, что предикаты для основных данных такие же, как CriteriaAPI для JPA, где в буквальном смысле нигде нет строки, и я могу условно добавлять или удалять критерии (поскольку все это выражено в коде). Я уже наткнулся на NSCompoundPredicate, который может быть способом получения условных критериев для основных данных.

Ответ №1:

«Фрагменты», как вы их называете, могут содержать имена свойств, но вам не обязательно использовать имена свойств как литеральные строки. Вместо этого вы можете использовать %K заполнитель для замены в соответствующем имени свойства и использовать #keyPath функцию для создания строки из (проверенного компилятором) имени свойства:

 NSPredicate(format:"%K == %@",#keyPath(MyEntityClass.myProperty),...)
 

Смотрите здесь для получения дополнительной информации о %K заполнителе и здесь для обсуждения использования #keyPath .

Так что не нужно раздражаться — вы можете убедиться, что ваши предикаты проверяются во время компиляции и легче переходят в режим ожидания.

Комментарии:

1. Спасибо, приветствую! Я наткнулся на заполнитель %K, но пример кода также использовал строку в качестве замены. #keypath был тем, что я искал! Также спасибо за ссылки, я уже сильно запутался в первой статье ранее: D