我在基于Core Data的应用程序中添加了一个瞬态属性,我想我错过了一些东西。在数据模型编辑器中,我添加了名为optional
的{{1}},transient
,BOOL
属性。
在我的模型的头文件中,我添加了:isUnderwater
,然后我在实现文件中实现了这些方法:
@property (nonatomic) BOOL isUnderwater;
但是当我尝试将- (BOOL)isUnderwater {
... implementation ...
return (ret);
}
- (void)setIsUnderwater:(BOOL)isUnderwater {}
用作NSPredicate中的条件时,我收到此错误:isUnderwater
。
有什么想法吗?
谢谢!
答案 0 :(得分:30)
首先,您不能在NSFetchRequest
中使用针对SQLite存储的瞬态属性。当您使用SQLite时,NSFetchRequest
被翻译成sql并在数据库中运行,早在您的瞬态触摸之前。
此外,您不应该实现访问者,而应该使用@synthesize
。
接下来,如果您想设置瞬态属性,那么您应该在-awakeFromFetch
和/或-awakeFromInsert
中进行设置,而不是覆盖getter。
接下来,您的商家应该被称为underwater
,@property
定义应该是:
@property (nonatomic, retain, getter=isUnderwater) NSNumber *underwater;
注意:即使你在模型中声明它是一个布尔值,它仍然是代码中的NSNumber
。
最后,在transient属性上设置可选标志没有任何价值,因为无论如何它都会丢弃。
一旦实体在内存中,您就可以应用其他过滤器(即使是针对瞬态属性)。唯一的限制是,当您使用SQLite文件时,不能使用瞬态属性。
例如,您可以执行在所有实体中加载的NSFetchRequest
。然后,您可以立即对返回的NSPredicate
应用第二个NSArray
,然后进一步过滤掉对象。