В этом вопросе SO от 2010 OP спрашивает, как выполнить форматирование хранимого запроса на выборку, созданного в графическом интерфейсе XCode, чтобы обеспечить возможность подстановки переменной, когда хранимый запрос вызывается во время выполнения с использованием NSFetchRequest: fetchRequestFromTemplateWithName :. substitutionVariables
Apple имеет некоторую архивную документацию , в которой говорится о том, как сделать это в Obj-C, но Swift обрабатывает переменные по-разному, и я не нашел нигде документированного синтаксиса.
В моем приложении я ищу аудио дорожку, которая относится к определенной категории. Трек имеет атрибут trackCategory
, который определяется как Int64
В моем шаблоне Fetch Request я настроил пользовательский предикат с оператором trackCategory == $TRACKCATEGORY
. Насколько я понимаю, я устанавливаю условие, при котором объект будет возвращен, только если значение trackCategory
объекта соответствует значению переменной с именем $TRACKCATEGORY
, которое будет подставлено во время выполнения.
И затем в своем коде я пытаюсь вызвать этот хранимый запрос на выборку следующим образом:
fetchRequest = model.fetchRequestFromTemplate(withName:
"getUnplayedTracks", substitutionVariables: ["TRACKCATEGORY" : forCategory])!
Две вещи:
model
объявляется в верхней части ViewController (этот документ) как:
let model = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.managedObjectModel
.
forCategory
- это Int64, объявленное в другом месте.
Когда я собираю и запускаю это, я получаю SIGABRT с сообщением об ошибке:
Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «невозможно разрешить выражение переменной: $ TRACKCATEGORY»
Я уверен, что что-то упустил из-за того, как отформатирован оператор предиката Custom, но я просто не могу понять, что это такое.