0

这个问题已经被问过很多次了,我读过很多用户告诉我不建议将图像存储在数据库中,尤其是在 CoreData 中。他们似乎都忽略了他们这样做的原因。甚至 Apple 文档也说明了这一点,并且每个人都指向了这个方向,并且每次讨论都以这样的方式结束,“你可以,但存储路径更好”。

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

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

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

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

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

谢谢

4

3 回答 3

4

Core Data 通常在这里所做的并没有什么特别之处。它只是使用SQLite数据库。您可以将大量数据放入其中,但它只是不能很好地扩展。您可以在此处阅读有关它的更多信息:SQLite 中的内部与外部 BLOB

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

当您在 Xcode 中时,会有一个名为Allows External Storage的复选框,您可以检查Binary Data属性。

于 2012-06-02T08:10:02.713 回答
1

文件系统和围绕它的 API:s(就像网络服务器一样)经过优化,可以提供任何大小的文件,并在适当的情况下应用缓存。

CoreData 针对处理带有小块数据(如整数和短字符串)的对象图进行了优化。

此外,还有许多其他问题可能会逐渐影响您,例如定期清理 CoreData 使用的 SQLite 数据库,或者它无法缩小,只会增长。

于 2012-06-01T10:23:32.720 回答
0

莱昂纳多,

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

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

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

安德鲁

于 2012-06-02T17:06:55.997 回答