实现瞬态属性

Bil*_*hed 12 iphone core-data objective-c

我正在为我的基于Core Data的应用添加一个瞬态属性,我想我错过了一些东西.在数据模型编辑器,我加了optional,transient,BOOL物业叫isUnderwater.

在我的模型的头文件中,我添加了:@property (nonatomic) BOOL isUnderwater;,然后我在实现文件中实现了这些方法:

- (BOOL)isUnderwater {
    ... implementation ...
    return (ret);
}
- (void)setIsUnderwater:(BOOL)isUnderwater {}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试isUnderwater在NSPredicate中使用时,我得到了这个错误:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath isUnderwater not found in entity <NSSQLEntity Wheel id=2>'.

有任何想法吗?

谢谢!

Mar*_*rra 30

首先,您不能在NSFetchRequest针对SQLite存储的情况下使用瞬态属性.当您使用SQLite时NSFetchRequest,很久就会将您的瞬态转换为sql并对数据库运行.

此外,您不应该实现访问者,@synthesize而应该使用.

接下来,如果您想要设置瞬态属性,那么您应该在-awakeFromFetch和/或-awakeFromInsert而不是覆盖getter中进行设置.

接下来,应该调用您的属性underwater,@property定义应该是:

@property (nonatomic, retain, getter=isUnderwater) NSNumber *underwater;
Run Code Online (Sandbox Code Playgroud)

注意:即使你在模型中声明它是一个布尔值,它仍然是NSNumber代码.

最后,在瞬态属性上设置可选标志没有任何价值,因为无论如何它都会被丢弃.

更新

一旦实体在内存中,您可以应用其他过滤器(甚至是针对瞬态属性).唯一的限制是,当您使用SQLite文件时,不能使用瞬态属性.

例如,您可以NSFetchRequest在所有实体中执行加载.然后,您可以立即NSPredicate对返回的内容应用秒,NSArray然后进一步过滤掉对象.

  • 不,只是有点复杂.您仍然可以使用它来检测数据中的更改,但是只要有这些更改,您就需要更新辅助数组.我个人会找到一种方法来将瞬态属性改为存储属性.对数据进行去标准化往往会解决很多像这样的问题. (2认同)