【问题标题】:Provide example for why it is not advisable to store images in CoreData?请举例说明为什么不建议将图像存储在 CoreData 中?
【发布时间】:2012-06-01 09:56:47
【问题描述】:

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

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

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

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

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

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

谢谢

【问题讨论】:

    标签: objective-c core-data


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 定期清理 SQLite 数据库并不完全正确。您可以指定 PRAGMA auto_vacuum 并将其设置为 FULLINCREMENTAL 以避免这种情况。更多内容请关注SQLite documentation
      【解决方案3】:

      莱昂纳多,

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

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

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

      安德鲁

      【讨论】:

        猜你喜欢
        • 2016-09-23
        • 1970-01-01
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 2020-01-26
        • 2020-04-14
        • 2013-10-18
        • 2021-06-02
        相关资源
        最近更新 更多