我有一个应用程序,允许用户为他们的账户添加图片。
我想知道如何使用Core Data存储图像(从相机或照片库获取),因为我可能会为用户提供备份功能,并希望将图像数据传输到服务器。
我看到了一种设计建议,即创建一个Image
模型对象,并与User
模型对象创建1对1关系(这样只有在需要时才调用相关的Image对象)。但是,我不确定如何实际存储图像以及这是否在性能方面具有潜在的致命问题。
如果有任何尝试过此操作的人能给出方法和注意事项,我将不胜感激。
在 Core Data 中存储图像数据的规则如下:
大于等于 1 MB 的数据需要存储在磁盘上,并在 Core Data 存储中引用其路径。
您可以使用 transformable 数据类型直接将 NSImage 存储到 Core Data 中。实际上,您可以使用 transformable 数据类型存储任何实现 NSCoder 协议的内容。
就个人而言,我不会将其转换为 CGImageRef,因为这样可能会丢失很多信息。
虽然这个问题已经被提出了一段时间,但我想分享一下关于这个问题的经验。
如果您要存储数量不受限制的图像,则不建议将它们存储在数据库中。您应该记住,有一天您会添加数据模型的新版本,并且您将不得不在应用程序更新时从旧的数据库迁移到新的数据库。这需要时间。数据库文件越大,迁移所需的时间就越长。
如果您想在数据库中存储图像,请确保不要在UIApplicationDelegate
的application: didFinishLaunchingWithOptions:
方法中添加持久性存储。如果迁移没有在XX秒内完成,iOS将终止您的应用程序。
CGImageRef imageRef = uiImage.CGImage;
CGDataProviderRef dataProvider = CGImageGetDataProvider(imageRef);
NSData *imageData = (NSData*)CGDataProviderCopyData(dataProvider);
[managedObject setValue:imageData forKey:@"data"];
在这里,managedObject是你的核心数据图像对象,@"data"是二进制属性的名称。您可能还需要保存图像格式以便稍后反序列化图像。
另一种选择是将图像保存到磁盘中并将路径存储在核心数据中。