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

Objective c 请举例说明为什么不建议在CoreData中存储图像?,objective-c,core-data,Objective C,Core Data,这个问题已经被问过很多次了,我读过很多用户告诉我在数据库中存储图像是不可取的,尤其是在CoreData中。他们似乎都忽略了这样做的原因。即使是苹果的文档也说明了这一点,每个人都指向这个方向,每次讨论都以这样的方式结束:“你可以,但存储路径更好” 除了意见之外,我想举一个具体的例子,说明为什么这不是一个好的解决办法 我解释得更好,我在构建Web应用程序方面有很强的背景。从我的观点来看,我会给出一个具体的例子:不要将图像存储在数据库中,而是存储它们的路径,因为您可以让web服务器为它们提供服务,而w

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

除了意见之外,我想举一个具体的例子,说明为什么这不是一个好的解决办法

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

但是在桌面环境中,特别是在iOS应用程序中,如果满足以下条件,使用sqllite存储在核心数据中的缺点是什么:

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

对于图像,似乎也有100kb的限制。为什么?110120…200kb ecc会发生什么情况


感谢

文件系统及其周围的API:s(就像Web服务器一样)经过优化,可以为任何大小的文件提供服务,并在适当的地方应用缓存

CoreData经过优化,可用于处理包含小块数据(如整数和短字符串)的对象图


此外,还有许多其他问题会悄悄地出现在您身上,比如定期清理CoreData使用的SQLite数据库,否则它将无法收缩,只能增长。

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

CoreData经过优化,可用于处理包含小块数据(如整数和短字符串)的对象图


此外,还有许多其他问题会悄悄地出现在您的身上,比如定期清理CoreData使用的SQLite数据库,否则它将无法收缩,只是会增长。

核心数据在这里的正常功能没有什么特别之处。它只是使用一个数据库。您可以将大量数据放入其中,但它无法很好地扩展。您可以在此处阅读更多信息:

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


当您在Xcode中时,会有一个名为“允许外部存储”的复选框,您可以检查二进制数据属性。

核心数据在这里的正常功能没有什么特别之处。它只是使用一个数据库。您可以将大量数据放入其中,但它无法很好地扩展。您可以在此处阅读更多信息:

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

在Xcode中,会有一个名为“允许外部存储”的复选框,您可以检查二进制数据属性。

Leonardo

使用Lion/iOS 5,核心数据开始为您处理文件系统存储的大数据块

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

尽管如此,仍然有理由自己管理这些文件。如果你的blob非常大,比如说2+MB,你会想把它们映射到内存中,而不仅仅是把它们读入内存。(当内存警告出现时,操作系统会自动将其从驻留内存中清除。这是一件非常好的事情。)即使如此,您仍然存在文件描述符数量有限的问题

安德鲁·莱昂纳多

使用Lion/iOS 5,核心数据开始为您处理文件系统存储的大数据块

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

尽管如此,仍然有理由自己管理这些文件。如果你的blob非常大,比如说2+MB,你会想把它们映射到内存中,而不仅仅是把它们读入内存。(当内存警告出现时,操作系统会自动将其从驻留内存中清除。这是一件非常好的事情。)即使如此,您仍然存在文件描述符数量有限的问题


Andrew

定期清理SQLite数据库并非完全正确。您可以指定一个
PRAGMA auto_vacuum
,并将其设置为
FULL
INCREMENTAL
,以避免出现这种情况。更多信息请参阅。定期清理SQLite数据库并非完全正确。您可以指定一个
PRAGMA auto_vacuum
,并将其设置为
FULL
INCREMENTAL
,以避免出现这种情况。更多信息请访问。