将图像存储在sqlite中或只是对它的引用?

时间:2012-09-10 07:14:39

标签: objective-c ios core-data uiimage nsdata

我使用coredata创建了几个应用程序,我在sqlite中存储图像,但在某个地方我发现它很糟糕。我搜索了网,但我发现的只是这个建议:

  • 图片尺寸< 100kb 与相关数据存储在同一个表中
  • 图片尺寸< 1mb 存储在通过关系附加的单独表中 避免不必要地加载
  • 图片尺寸> 1mb 存储在磁盘上并在Core Data中引用它

所以我的问题是:在sqlite数据库中将图像保存为NSData的优缺点是什么,并且在图像保存在文件系统中时只存储图像的引用?

3 个答案:

答案 0 :(得分:7)

Apple在Core Data Performance指南中就此主题提供了一些指导。一般来说,虽然SQLite可以很好地扩展,并且可以轻松处理大小为几千兆字节的数据库,但是大型二进制blob不可查询或可索引,并且几乎不会返回数据库的大小。

如果您的目标是iOS 4及更高版本,则可以在包含此类数据的属性上设置“Allows External Binary Data Storage”标记,Core Data会自动将它们分别存储在文件系统中(如果它认为合适) ),并自动管理数据存储中该数据的链接。

答案 1 :(得分:1)

好处:不太确定,但我可以想到在数据库中存储链接的几个好处。

  1. 与文件系统的本机代码交互将比SQLite图像提取更快。 (整体表现更快)

  2. 清洁且可扩展的数据库 - (关注大小,迁移会更容易)

答案 2 :(得分:1)

您可能想要查看我得到的答案,以获得类似的主题(如果不是相同的话)。因为你我只找到了提供建议的人,但没有人真正提供基准和真正的技术答案。

Provide example for why it is not advisable to store images in CoreData?

除此之外,我的应用程序已经在db中实现了所有图像,然后运到app store, 我可以告诉你,如果你使用iCloud,事情会更容易。如果您在UITableView中使用带有缩略图图标的小图像,则可以完全避免异步图像加载。

只有一个建议,为每个图像大小提供一个实体,而不是将所有建议存储在附加到主实体的集合中。

我发现使用iCloud时唯一的缺点是每次更改图像时生成的事务日志都会更大。但在我看来,图像很小,而且更新图像的需求很少。此外,iCloud + CoreData目前非常多,所以我在发货前将其删除,所以目前对我来说真的不是问题。