代码之家  ›  专栏  ›  技术社区  ›  TechZen

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

  •  6
  • TechZen  · 技术社区  · 15 年前

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

    变革背后的理念 属性是您访问 属性作为非标准类型,但是 后台核心数据使用 NSValueTransformer到的实例 将属性转换为 nsdata的实例。那么核心数据 将数据实例存储到 持久存储。

    …意思是只能将数据转换为数据,而不能将其他类型的属性(如字符串)转换为数据。

    我突然想到可能不是这样。文档可能只是在讨论最常见的情况。iirc,在cocoa绑定中,转换在很大程度上是任意的。例如,可以将nsurl转换为nsstring以供显示,然后将其反转。

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

    2 回复  |  直到 8 年前
        1
  •  4
  •   Alex    15 年前

    对的。必须将属性转换为 NSData 反对。您需要序列化 NSURL 操作文件数据 --以及违约 NSKeyedUnarchiveFromDataTransformerName 变形金刚会帮你的。

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

    没有办法强制执行它,但您确实不想使用实体类之外的string属性。我通常做 @property 字符串属性private的定义,以提醒自己不要使用它。

        2
  •  0
  •   Robert St. John    8 年前

    我没有足够的观点可以发表评论,所以我必须以回答的形式作出贡献。我只是试着按照阿穆德的建议,用 NSValueTransformer 转换 NSURL 对象到 NSString 可转换属性的对象。不幸的是,核心数据仍然期望 NSData 来自转换器的实例,不管 transformedValueClass . 核心数据仍然会创建带有该可转换属性的blob列的sqlite数据库,保存实体会导致 uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString bytes]: unrecognized selector sent to instance 0x608000075bc0' . 核心数据正在尝试调用 [NSData bytes] NSstring公司 提供我的变压器实例。对我来说,这似乎是核心数据中的一个大漏洞,因为我确信有无数的非标准类型可以作为字符串属性存储和查询。

    除了使用 NSstring公司 ,即按照@alex描述的方式执行,并使用瞬态属性和派生值。但是,核心数据并不能使这变得非常干净,因为正如@alex所说,没有办法强制独占使用临时属性访问器。