3

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

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

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

4

3 回答 3

7

Apple 在其核心数据性能指南中提供了有关此主题的一些指导。一般来说,尽管 SQLite 可扩展性很好并且可以轻松处理数 GB 大小的数据库,但大型二进制 blob 不可查询或可索引,并且会膨胀数据库的大小而几乎没有回报。

如果您的目标是 iOS 4 及更高版本,您可以在包含此类数据的属性上设置“允许外部二进制数据存储”标志,Core Data 会自动将它们单独存储在文件系统中(如果它认为合适的话),并且自动管理指向数据存储中该数据的链接。

于 2012-09-10T07:25:21.747 回答
1

Benefits: Not so sure, but I can think of couple of benefits of storing just links in the database.

  1. The native code interaction with the file system would be faster than the SQLite image fetching. (overall faster performance)

  2. Clean and scalable database -- (with size being the concern, migration would be easier)

于 2012-09-10T07:27:14.067 回答
1

您可能想检查我得到的类似(如果不相同)主题的答案。因为作为您,我只发现有人提供建议,但没有人真正提供基准和真正的技术答案。

请举例说明为什么不建议将图像存储在 CoreData 中?

除此之外,在我的应用程序已经实现了数据库中的所有图像并发送到应用程序商店之后,我可以告诉你,如果你使用 iCloud,事情会变得更容易。如果在 UITableView 中使用带有缩略图图标的小图像,则可以完全避免异步图像加载。

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

我发现使用 iCloud 的唯一缺点是每次更改图像时都会生成更大的事务日志。但在我的情况下,图像很小,更新图像的需求很少。另外,目前 iCloud+CoreData 有很多问题,所以我在发货前删除了它,所以目前这对我来说真的不是问题。

于 2012-09-10T08:32:12.183 回答