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

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

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

我碰到过创buildImage模型对象的devisebuild议,并与User模型对象创build了1对1的关系(因此除非需要,才能调用相关的Image对象)。 但是,我不确定如何实际存储图像,以及这在性能方面是否可能是致命的。

对于任何有此尝试的人的方法和陷阱,我将不胜感激。

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

  • 在相关实体(人,地址,任何)中<100 kb存储。
  • 在另一个关系的另一个单独的实体存储<1 MB,以避免性能问题。
  • 1 MB存储在磁盘上,并引用您的Core Data存储中的path。

您可以使用可转换的数据types将NSImage直接存储到Core Data中。 事实上,您可以使用可转换数据types来存储实现NSCoder协议的任何内容。

我个人不会将其转换为CGImageRef,因为您可能会丢失大量信息。

这个问题已经过了一段时间,但我想分享一下我在这个问题上的经验。

如果他们的数量没有限制,我不会build议你在数据库中存储图像。 你应该永远记住,有一天你会添加新版本的数据模型,你将不得不从旧数据库迁移到新的应用程序更新。 这需要时间。 DB文件越大,迁移所需的时间就越长。

如果你想在DB中存储图像,请确保不要在application: didFinishLaunchingWithOptions:添加持久性存储application: didFinishLaunchingWithOptions: UIApplicationDelegate application: didFinishLaunchingWithOptions:方法。 如果迁移不能在XX秒内完成,iOS将终止您的应用程序。

陷阱:你可能最终会处理sqlite数据库。 你真的希望你的用户一步到服务器上传一个MB文件吗? 如果celluar连接中断几秒钟,你会怎么做?

如果你使用核心数据来pipe理你的图片和上传状态(上传:是或否),我认为会更好。 这样,您就可以将图像上传到应用程序工作stream程中。 好吧,由于有许多连接,它会持续一段时间。 但是,我觉得是一个更清洁的方法。

当你想到iTunes时,在谈到备份时:无论如何你的本地iPhone'文件'文件夹是同步的。

你将不得不有aaa,那么你可以做这样的事情:

 CGImageRef imageRef = uiImage.CGImage; CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef); NSData *imageData = (NSData*)CGDataProviderCopyData(dataProvider); [managedObject setValue:imageData forKey:@"data"]; 

其中managedObject是核心数据映像对象,@“data”是二进制属性的名称。 您可能还需要保存图像格式以便稍后反序列化图像。

另一个select是将映像保存到磁盘并将path存储在核心数据中。