iPhone核心数据:可转换属性是不是必须仅转换为数据?

Posted

技术标签:

【中文标题】iPhone核心数据:可转换属性是不是必须仅转换为数据?【英文标题】:iPhone Core Data: Do Transformable Attributes have to Transform to only Data?iPhone核心数据:可转换属性是否必须仅转换为数据? 【发布时间】:2010-02-02 22:33:41 【问题描述】:

我一直在核心数据中使用可转换属性将图像和颜色等复杂对象转换为原始数据。我拿了this...

可变形背后的理念 属性是你访问一个 属性作为非标准类型,但是 在幕后,Core Data 使用了 NSValueTransformer 的实例到 将属性转换为 NSData 的实例。核心数据然后 将数据实例存储到 持久存储。

...意味着您只能将事物与数据进行转换,而不能转换为其他类型的属性之一,例如字符串。

我突然想到,情况可能并非如此。该文档可能只是在谈论最常见的情况。 IIRC,在 Cocoa 绑定中,转换在很大程度上可以是任意的。例如,可以将 NSURL 转换为 NSString 以进行显示,然后将其反转。

在我浪费时间进行实验并可能得到一个令人困惑的结果之前,我想知道是否有人确定转换是否只是数据的往返。

【问题讨论】:

【参考方案1】:

正确。您必须将属性转换为 NSData 对象。您需要将NSURL 序列化为NSData——默认的NSKeyedUnarchiveFromDataTransformerName 转换器将为您完成此操作。

另一种方法,也是我用于 URL 的方法,是维护两个并行属性。 URL 的一个未定义类型的临时属性,以及后备存储的第二个字符串类型的持久属性。我在第一次请求时从字符串中懒惰地构造 URL,并且每当 URL 更改时我都会更新字符串属性。

没有办法强制执行它,但您确实不想使用实体类之外的字符串属性。我一般将字符串属性的@property定义设为私有,以提醒自己不要使用它。

【讨论】:

是的,我使用相同的方法已经有一段时间了,我只是想检查一下我没有误解什么。 但是官方文档显示了一个示例代码sn-p使用+ (Class)transformedValueClass return [NSString class]; ,似乎NSValueTransformer可以转换为NSString..我完全糊涂了..:S @Kjuly 你是完全正确的。实际上,自定义NSValueTransformer 允许将您的对象转换为可由Core Data 存储的对象。所以您可以将您的NSURL 转换为NSStringNSDataNSKeyedUnarchiveFromDataTransformerName 是现有转换器的名称,它将符合<NSCoding> 的类转换为NSData无需额外代码 优秀。正是我需要知道的。【参考方案2】:

我没有足够的积分来评论,所以我必须以答案的形式贡献。我只是尝试完全按照@Amaud 的建议去做,使用NSValueTransformerNSURL 对象转换为NSString 对象以获得Transformable 属性。不幸的是,无论transformedValueClass 是什么,Core Data 仍然期望来自转换器的NSData 实例。 Core Data 仍然为该可转换属性创建带有 BLOB 列的 SQLite 数据库,并且保存实体会导致 uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bytes]: unrecognized selector sent to instance 0x608000075bc0' 崩溃。 Core Data 试图在我的转换器提供的NSString 实例上调用[NSData bytes]。这对我来说似乎是 Core Data 中的一个大漏洞,因为我确信有无数非标准类型可以作为字符串属性存储和查询。

除了使用NSString 之外,似乎唯一的选择就是按照@Alex 的描述使用瞬态属性和派生值。然而,Core Data 并没有做到这一点,因为正如@Alex 所说,没有办法强制使用瞬态属性访问器。

【讨论】:

以上是关于iPhone核心数据:可转换属性是不是必须仅转换为数据?的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 changedValues 是不是忽略二进制数据和转换后的属性?

字段转换为 iPad 和 iPhone 上的电话号码链接

是否可以访问核心数据中的原始数据以获取可转换属性

核心数据可转换属性(NSArray)为空

iCloud核心数据不传输图像

如何更新核心数据中的可转换属性