核心数据 – 存储图像(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存储在核心数据中。