我有一个应用程序,我允许用户为其帐户添加图像。
我想知道如何存储图像(从相机或照片库中获取)使用核心数据,因为我可能会为用户提供备份工具,并希望传输图像数据到服务器。
我遇到了创建Image
模型对象并与User
模型对象创建一对一关系的设计建议(以便除非关联的Image对象被调用,否则需要)。但是,我不确定如何实际存储图像以及这在性能方面是否可能致命。
对于任何尝试过这种做法的人的方法和陷阱,我将不胜感激。
答案 0 :(得分:84)
在Core Data中存储图像数据的规则如下:
磁盘上存储1 MB,并引用Core Data存储中的路径。
您可以使用可转换数据类型将NSImage直接存储到Core Data中。实际上,您可以使用可转换数据类型来存储实现NSCoder协议的任何内容。
我个人不会将它转换为CGImageRef,因为你可能会丢失很多信息。
答案 1 :(得分:29)
自问这个问题以来已经过了一段时间,但我想分享一下我对此问题的经验。
如果数量不受限制,我建议您不要在数据库中存储图像。您应该记住,有一天您将添加新版本的数据模型,并且您必须在App更新时从旧数据库迁移到新数据库。这需要时间。数据库文件越大,迁移所需的时间越长。
如果要在DB中存储图像,请确保不要在application: didFinishLaunchingWithOptions:
UIApplicationDelegate
方法中添加持久性存储。如果迁移无法在XX秒内完成,iOS将终止您的应用。
答案 2 :(得分:4)
陷阱:你可能最终庞大,难以处理sqlite数据库。您真的希望您的用户一步上传几个MB文件到服务器吗?如果细胞连接发生故障几秒钟,你会怎么做?
如果您使用Core Data管理图片及其上传状态(上传:是或否),我认为会更好。这样,您可以在适合应用程序工作流程时上传图像。好的,由于有很多连接,它会持续一段时间。但我认为这是一种更清洁的方法......
当您考虑iTunes时,在谈到备份时:无论如何都会同步本地iPhone“Documents”文件夹。
答案 3 :(得分:3)
你必须有一个a,然后你可以做这样的事情:
CGImageRef imageRef = uiImage.CGImage;
CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef);
NSData *imageData = (NSData*)CGDataProviderCopyData(dataProvider);
[managedObject setValue:imageData forKey:@"data"];
其中managedObject是您的核心数据图像对象,@“data”是二进制属性的名称。您可能还需要保存图像格式,以便稍后反序列化图像。
另一种选择是将图像保存到磁盘并将路径存储在核心数据中。