Я добавляю переходное свойство в свое приложение на основе Core Data и думаю, что что-то упускаю. В редакторе модели данных я добавил свойство optional, transient, BOOL с именем isUnderwater.
В заголовочный файл моей модели я добавил: @property (nonatomic) BOOL isUnderwater;, затем реализовал эти методы в файле реализации:
- (BOOL)isUnderwater {
... implementation ...
return (ret);
}
- (void)setIsUnderwater:(BOOL)isUnderwater {}
Но когда я пытаюсь использовать isUnderwater в качестве условия в NSPredicate, я получаю эту ошибку: *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath isUnderwater not found in entity <NSSQLEntity Wheel id=2>'.
Любые идеи?
Спасибо!
Ответ 1 · рейтинг 30 · Marcus S. Zarra
Во-первых, вы не можете использовать временное свойство в NSFetchRequest, которое идет против хранилища SQLite. Когда вы используете SQLite, NSFetchRequest переводится в sql и запускается в базе данных задолго до того, как ваш переходный процесс будет затронут.
Кроме того, вам не следует реализовывать средства доступа, вместо этого вы должны использовать @synthesize.
Затем, если вы хотите установить переходное свойство, вы должны установить его в -awakeFromFetch и/или -awakeFromInsert вместо переопределения геттера.
Затем ваше свойство должно называться underwater, а определение @property должно быть:
@property (nonatomic, retain, getter=isUnderwater) NSNumber *underwater;
Примечание: несмотря на то, что вы объявляете его логическим в своей модели, в коде он по-прежнему является NSNumber.
Наконец, установка необязательного флага для переходного свойства не имеет значения, поскольку оно все равно будет отброшено.
Обновлять
Вы можете применять дополнительные фильтры (даже к временным свойствам), когда объекты находятся в памяти. Единственное ограничение заключается в том, что вы не можете использовать переходные свойства при переходе к файлу SQLite.
Например, вы можете выполнить NSFetchRequest, который загрузит все объекты. Затем вы можете сразу же применить второй NSPredicate к возвращенному NSArray и дополнительно отфильтровать объекты.