我一直在使用base64编码。我已成功将图像编码为NSData的NSString,我还将其解码回NSData。
所以现在我想将图像存储在Core Data中。但是最好存储NSString,NSData还是第三个可转换的?
我将图像转换为NSString的原因是因为我也希望将它存储在XML中。
提前致谢。
答案 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)
现在,较新版本的Xcode和iOS使存储图像既简单又高效。为方便起见,您不再需要选择将图像存储在核心数据中,也不必选择将文件存储在文件系统中 - Core Data会为您处理。
UIImage
现在符合iOS 5中的NSCoding
。如果您能够定位iOS 5及更高版本,则可以将托管对象的属性设置为Transformable
并完成