哪种方式存储数据(图像)? NSData,String或Transformable

时间:2011-11-26 19:12:25

标签: objective-c ios xcode core-data

我一直在使用base64编码。我已成功将图像编码为NSData的NSString,我还将其解码回NSData。

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

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

提前致谢。

4 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:7)

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

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

祝你好运

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:1)

目标iOS5或更高版本 - Performant Image存储变得微不足道

现在,较新版本的Xcode和iOS使存储图像既简单又高效。为方便起见,您不再需要选择将图像存储在核心数据中,也不必选择将文件存储在文件系统中 - Core Data会为您处理。

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