Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Bill SmithedОтветов: 1

Я добавляю переходное свойство в свое приложение на основе 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>'.

Любые идеи?

Спасибо!

  • В качестве альтернативы вы можете создать подходящий метод проверки NSManagedObject: stackoverflow.com/questions/1022284/ PostCodeism 14.10.2010

iphoneobjective-ccore-data

Ответы

Ответ 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 и дополнительно отфильтровать объекты.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы