核心数据 - 存储图像(iPhone)

时间:2010-01-18 23:41:47

标签: iphone image core-data storage

我有一个应用程序,我允许用户为其帐户添加图像。

我想知道如何存储图像(从相机或照片库中获取)使用核心数据,因为我可能会为用户提供备份工具,并希望传输图像数据到服务器。

我遇到了创建Image模型对象并与User模型对象创建一对一关系的设计建议(以便除非关联的Image对象被调用,否则需要)。但是,我不确定如何实际存储图像以及这在性能方面是否可能致命。

对于任何尝试过这种做法的人的方法和陷阱,我将不胜感激。

4 个答案:

答案 0 :(得分:84)

在Core Data中存储图像数据的规则如下:

  • <相关实体中的100 kb商店(人,地址,等等)。
  • < 1 MB存储在关系另一端的单独实体中,以避免性能问题。
  •   

    磁盘上存储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”是二进制属性的名称。您可能还需要保存图像格式,以便稍后反序列化图像。

另一种选择是将图像保存到磁盘并将路径存储在核心数据中。