实现瞬态属性

时间:2010-08-24 03:44:40

标签: iphone objective-c core-data

我在基于Core Data的应用程序中添加了一个瞬态属性,我想我错过了一些东西。在数据模型编辑器中,我添加了名为optional的{​​{1}},transientBOOL属性。

在我的模型的头文件中,我添加了:isUnderwater,然后我在实现文件中实现了这些方法:

@property (nonatomic) BOOL isUnderwater;

但是当我尝试将- (BOOL)isUnderwater { ... implementation ... return (ret); } - (void)setIsUnderwater:(BOOL)isUnderwater {} 用作NSPredicate中的条件时,我收到此错误:isUnderwater

有什么想法吗?

谢谢!

1 个答案:

答案 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,然后进一步过滤掉对象。