я добавляю временное свойство в свое приложение на основе Core Data, и мне кажется, что я чего-то упускаю. В редакторе модели данных я добавил необязательное
, переходное
, BOOL
свойство с именем isUnderwater
.
В файле заголовка моей модели я добавил: @property (nonatomic) BOOL isUnderwater;
, затем я реализовал эти методы в файле реализации:
- (BOOL)isUnderwater {
... implementation ...
return (ret);
}
- (void)setIsUnderwater:(BOOL)isUnderwater {}
Но когда я пытаюсь использовать isUnderwater
в качестве условия в NSPredicate я получаю следующую ошибку: *** Завершение работы приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «keypath isUnderwater не найден в объекте
.
Есть идеи?
Спасибо!
Во-первых, вы не можете использовать временное свойство в NSFetchRequest
, которое противоречит магазин SQLite. Когда вы используете SQLite, NSFetchRequest
транслируется в sql и запускается в базе данных задолго до того, как ваш переходный процесс будет затронут.
Кроме того, вам не следует реализовывать аксессоры, вместо этого вы должны использовать @synthesize
.
Затем, если вы хотите установить временное свойство, вам следует установить его в -awakeFromFetch
и / или -awakeFromInsert
вместо того, чтобы переопределять геттер.
Затем ваше свойство должно называться underwater
, а определение @property
должно быть:
@property (nonatomic, retain, getter=isUnderwater) NSNumber *underwater;
Примечание: даже если вы объявляете его логическим значением в своей модели, оно по-прежнему NSNumber
в коде.
Наконец, установка необязательного флага для временного свойства не имеет значения, так как оно все равно будет отброшено.
Вы можете применять дополнительные фильтры (даже против переходных свойств), когда объекты находятся в памяти. Единственное ограничение заключается в том, что вы не можете использовать переходные свойства при переходе к файлу SQLite.
Например, вы можете выполнить NSFetchRequest
, который загружается во все объекты. Затем вы можете немедленно применить второй NSPredicate
к возвращенному NSArray
и дополнительно отфильтровать объекты.