以哪种方式存储数据(图像)? NSData、字符串或可转换

Posted

技术标签:

【中文标题】以哪种方式存储数据(图像)? NSData、字符串或可转换【英文标题】:Which way to store data(image)? NSData, String or Transformable 【发布时间】:2011-11-26 19:12:25 【问题描述】:

我一直在使用 base64 编码。我已经成功地将图像从 NSData 编码为 NSString,我还将它解码回 NSData。

所以现在我想将图像存储在 Core Data 中。但是最好存储一个 NSString、NSData 还是第三个可转换对象?

我将图像转换为 NSString 的原因是我也想将它存储在 XML 中。

提前致谢。

【问题讨论】:

【参考方案1】:

可转换(根据@timthetoolman)是最简单的方法。但是,如果您的图像很大,从 ios 5 开始,正确的做法是使用“二进制数据”属性类型并选择“允许外部存储”,以便 Core Data 可以将大块数据存储在数据库。这样会更有效率。

【讨论】:

【参考方案2】:

使用 NSValueTransformer 将图像转换为 NSData 对象,然后将数据块存储在 Core Data 中。您可以在建模工具中注册您的价值转换器子类。您可以查看 Apple 的 PhotoLocations 示例或此 tutorial 说明如何操作。

为完整性而编辑:正如其他人指出的那样,太大的数据块会导致性能问题。正如@Jesse 所指出的,iOS5 有一个优化,如果数据块太大,那么 Core Data 会将它存储在持久存储之外。如果您必须针对 iOS5 之前的版本并且图像太大,那么您应该将文件保存在沙箱中的某个位置,并将 URL 存储在 Core Data 存储中。 Apple Dev Forums is here 中的一个很好的讨论,并讨论了在 Core Data 中存储数据 blob 的限制。

祝你好运

【讨论】:

我明白了,所以首选的方法是使用 NSValueTransformer。但这不会让我无法将图像存储在 XML 中吗? 你创建的 NSValueTransfirmer 的子类可以从一个值转换为另一个值。您需要编写执行转换的代码,以便无法转换为您喜欢的格式!【参考方案3】:

我认为您不应该将它们存储在核心数据中,我用图像尝试过一次,发现它太慢了。您应该将图像的位置存储在核心数据中,但只需将图像写入文件。你可以这样做:

// JPEG
[UIImageJPEGRepresentation(image, 1.0) writeToFile:jpgPath atomically:YES];

// PNG
[UIImagePNGRepresentation(image) writeToFile:pngPath atomically:YES];

【讨论】:

同意。除非它们实际上是 10 千字节,否则文件系统是仅在核心数据中存储引用的方式。核心数据是对象存储而不是数据库。【参考方案4】:

以 iOS5 或更高版本为目标——高性能图像存储变得微不足道

Xcode 和 iOS 的较新版本现在使存储图像既简单又高效。您不再需要为了方便而选择将图像存储在核心数据中,或者为了性能而选择将图像存储在文件系统中——核心数据会为您处理好它。

UIImage 现在符合 iOS 5 中的 NSCoding。如果您能够针对 iOS 5 及更高版本,您只需将托管对象的属性设置为 Transformable 即可。 如果您选中“允许外部存储”选项,Core Data 将决定是将 BLOB 存储在托管对象中还是作为外部文件存储——所有这些都对开发人员透明。将更大的图像保存在您的 Core Data 存储之外

【讨论】:

以上是关于以哪种方式存储数据(图像)? NSData、字符串或可转换的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 C# 以哪种格式将声音存储在数据库中

我应该以哪种格式将图像从 Rust 传递给 JS?

求推荐go语言开发工具及go语言应该以哪种目录结构组织代码?

CentOS6.6磁盘以哪种类型安装

C ++位移哪种方式

是否可以将图像存储为可可中的字符串?