【问题标题】:Implementing Transient Properties实现瞬态属性
【发布时间】:2010-08-24 03:44:40
【问题描述】:

我正在向基于 Core Data 的应用程序添加一个瞬态属性,但我认为我遗漏了一些东西。在数据模型编辑器中,我添加了一个名为 isUnderwateroptionaltransientBOOL 属性。

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

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

但是当我尝试在 NSPredicate 中使用 isUnderwater 作为条件时,我收到此错误:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath isUnderwater not found in entity <NSSQLEntity Wheel id=2>'

有什么想法吗?

谢谢!

【问题讨论】:

标签: iphone objective-c core-data


【解决方案1】:

首先,您不能在NSFetchRequest 中使用与 SQLite 存储区相冲突的瞬态属性。当您使用 SQLite 时,NSFetchRequest 被翻译成 sql 并针对数据库运行,早在您的瞬态被触及之前。

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

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

接下来,您的属性应称为underwater@property 定义应为:

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

注意:即使您在模型中将其声明为布尔值,它仍然是代码中的 NSNumber

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

更新

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

例如,您可以执行 NSFetchRequest 加载所有实体。然后,您可以立即对返回的NSArray 应用第二个NSPredicate 并进一步过滤对象。

【讨论】:

  • 这是有道理的。但是如何使用基于自定义逻辑而不是存储/非瞬态属性过滤的核心数据对象填充 UITableView?例如,如果我希望能够在一个类型的所有对象和那些以某种方式设置瞬态属性的对象之间切换(即,通过某个逻辑测试)?我会考虑使用块,但对于 SQLite 存储,这些块也不可用......
  • 覆盖 getter 是完全有效的(特别是因为你和我都不知道他在里面做什么)。还可以完美地发现在实际上是 BOOL 的瞬态属性上使用 BOOL。完全没有理由在 NSNumber 中装箱和拆箱——尤其是因为他提供了自己的 NSManagedObject 子类。我经常使用由原语支持的托管属性来执行此操作,以便更轻松地访问。
  • @Jason 用自定义逻辑覆盖访问器是不好的形式。如果您正在使用属性,则访问器应该只访问该值;不执行自定义逻辑。此外,如果您将瞬态NSNumber 声明为BOOL,您就是在自找麻烦。今天可能会起作用,但我严重怀疑它是否会一直起作用。我不会推荐它。
  • you could perform a NSFetchRequest that loads in all of the entities. You could then immediately apply a second NSPredicate against the returned NSArray and further filter the objects down. 那么这是否意味着 NSFetchedResultsController 已“脱离桌面”?
  • 不,只是有点复杂。您仍然可以使用它来检测数据中的更改,但是每当这些更改出现时,您都需要更新辅助数组。就我个人而言,我会找到一种方法来使该瞬态属性成为存储属性。去规范化数据往往可以解决很多这样的问题。
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 2011-02-10
  • 2023-03-29
  • 1970-01-01
  • 2011-08-11
  • 2011-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多