Реализация переходных свойств

я добавляю временное свойство в свое приложение на основе Core Data, и мне кажется, что я чего-то упускаю. В редакторе модели данных я добавил необязательное , переходное , BOOL свойство с именем isUnderwater .

В файле заголовка моей модели я добавил: @property (nonatomic) BOOL isUnderwater; , затем я реализовал эти методы в файле реализации:

- (BOOL)isUnderwater {
    ... implementation ...
    return (ret);
}
- (void)setIsUnderwater:(BOOL)isUnderwater {}

Но когда я пытаюсь использовать isUnderwater в качестве условия в NSPredicate я получаю следующую ошибку: *** Завершение работы приложения из-за неперехваченного исключения «NSInvalidArgumentException», причина: «keypath isUnderwater не найден в объекте » .

Есть идеи?

Спасибо!

12
задан Bill Smithed 24 August 2010 в 03:44
поделиться

1 ответ

Во-первых, вы не можете использовать временное свойство в NSFetchRequest , которое противоречит магазин SQLite. Когда вы используете SQLite, NSFetchRequest транслируется в sql и запускается в базе данных задолго до того, как ваш переходный процесс будет затронут.

Кроме того, вам не следует реализовывать аксессоры, вместо этого вы должны использовать @synthesize .

Затем, если вы хотите установить временное свойство, вам следует установить его в -awakeFromFetch и / или -awakeFromInsert вместо того, чтобы переопределять геттер.

Затем ваше свойство должно называться underwater , а определение @property должно быть:

@property (nonatomic, retain, getter=isUnderwater) NSNumber *underwater;

Примечание: даже если вы объявляете его логическим значением в своей модели, оно по-прежнему NSNumber в коде.

Наконец, установка необязательного флага для временного свойства не имеет значения, так как оно все равно будет отброшено.

Обновление

Вы можете применять дополнительные фильтры (даже против переходных свойств), когда объекты находятся в памяти. Единственное ограничение заключается в том, что вы не можете использовать переходные свойства при переходе к файлу SQLite.

Например, вы можете выполнить NSFetchRequest , который загружается во все объекты. Затем вы можете немедленно применить второй NSPredicate к возвращенному NSArray и дополнительно отфильтровать объекты.

30
ответ дан 2 December 2019 в 05:03
поделиться