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

时间:2012-06-01 09:56:47

标签: objective-c core-data

这个问题已被多次询问,我已经阅读过许多用户告诉我们不建议将图像存储在数据库中,特别是在CoreData中。他们似乎都忽略了他们这样做的原因。即使是Apple文档也说明了这一点,并且每个人都指向了这个方向,并且每个讨论都像这样“尽你所能,但存储路径更好”。

除了意见之外,我想有一个具体的例子说明为什么它不是一个好的解决方案。

我解释得更好,我在构建Web应用程序方面有很强的背景。从我的角度来看,我给出的一个具体例子可能是:不要将图像存储在数据库中,而是存储它们的路径,因为您可以通过Web服务器为它们提供服务,这可以应用它的所有缓存问题。

但是在桌面环境中,特别是在iOS应用程序中,使用sqllite存储在Core Data中的缺点是什么,提供:

  

有一个单独的实体持有图像,它不是一个属性   主要实体

对于图像似乎也是100kb的限制。为什么? 110,120 ... 200kb ecc会发生什么?

感谢

3 个答案:

答案 0 :(得分:4)

核心数据通常在这里做什么没有什么特别之处。它只是使用SQLite数据库。您可以将大量数据放入其中,但它不能很好地扩展。您可以在此处详细了解:Internal Versus External BLOBs in SQLite

也就是说,Core Data支持外部blob ,在核心数据术语中称为存储在外部记录中(iOS 5.0及更高版本)。同样,它没有什么神奇之处,它只是将大块数据与SQLite数据库本身分开存储在文件系统中。好处是Core Data会为您更新所有这些。

当您使用Xcode时,会出现一个名为允许外部存储的复选框,您可以检查二进制数据属性。

答案 1 :(得分:1)

文件系统及其周围的API(就像网络服务器一样)经过优化,可以提供任意大小的文件,并在适当的时候应用缓存。

CoreData针对处理具有微小数据的对象图进行了优化,如整数和短字符串。

此外,还有许多其他问题会蔓延到您身上,例如定期清理SQLite数据库CoreData使用的问题,或者它无法缩小,只是增长。

答案 2 :(得分:0)

莱昂纳多,

使用Lion / iOS 5,Core Data开始为您处理大型BLOB的文件系统存储。

选择权取决于您打开的图像数量。如果你有很多,那么你应该将它们保存在数据库中。为什么?因为您只有适度数量的文件描述符,其中一个用于存储在文件系统中的每个打开图像。

也就是说,仍然有理由自己管理文件。如果你的BLOB非常大,比如说2+ MB,你会想要将它们映射到内存而不是只读它们。(当内存警告到来时,这会让操作系统自动将它们从你的驻留内存中清除。这是一个非常好的。)即便如此,你仍然有有限数量的文件描述符问题。

安德鲁