在核心数据中存储图像

Posted

技术标签:

【中文标题】在核心数据中存储图像【英文标题】:Storing images in core data 【发布时间】:2011-07-19 23:15:02 【问题描述】:

我们应该使用核心数据存储图像吗?这被认为是一个好习惯吗?我认为它可能有更少的内存占用,因为核心数据会在对象被实际访问之前出错。

【问题讨论】:

如果您将图像存储到核心数据中,那么它将使您的数据库变得繁重。我想如果您将具有唯一名称的图像存储在内存中并将文件路径存储到数据库中,那可能会很好。但我认为这可能很棘手。 【参考方案1】:

这并不理想。

人们这样做(包括我)。我使用数据转换器,效果很好。

一种选择是存储文件名。

在即将发布的 CoreData 版本中会有更好的选择。

【讨论】:

【参考方案2】:

实际上,根据苹果文档,您应该根据文件大小使用核心数据:请参阅核心数据编程指南这一章:

https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/CoreData/Performance.html#//apple_ref/doc/uid/TP40001075-CH25-SW11

大数据对象 (BLOB)

如果您的应用程序使用大型 BLOB(“二进制大型对象”,例如图像和声音数据),您需要注意尽量减少开销。 “小”、“适中”和“大”的确切定义是可变的,取决于应用程序的使用情况。一个宽松的经验法则是,大小为千字节的对象是“适度”大小的,而大小为兆字节大小的对象是“大”大小的。一些开发人员已经在数据库中使用 10MB BLOB 实现了良好的性能。另一方面,如果一个应用程序在一个表中有数百万行,那么即使是 128 字节也可能是一个“适度”大小的 CLOB(字符大对象),需要将其规范化为一个单独的表。

一般来说,如果您需要将 BLOB 存储在持久存储中,您应该使用 SQLite 存储。 XML 和二进制存储要求整个对象图驻留在内存中,并且存储写入是atomic(请参阅“持久存储功能”(第 130 页)),这意味着它们不能有效地处理大型数据对象。 SQLite 可以扩展以处理超大型数据库。如果使用得当,SQLite 可为高达 100GB 的数据库提供良好的性能,单行最多可容纳 1GB(当然,将 1GB 的数据读入内存是一项昂贵的操作,无论存储库的效率如何)。

BLOB 通常表示实体的属性,例如,照片可能是 Employee 实体的属性。对于小到中等大小的 BLOB(和 CLOB),您应该为数据创建一个单独的实体,并创建一对一的关系来代替属性。例如,您可以创建 Employee 和 Photo 实体,它们之间具有一对一的关系,其中 Employee 到 Photo 的关系替换了 Employee 的 photo 属性。这种模式最大化了对象故障的好处(请参阅“故障和唯一性”(第 110 页))。任何给定的照片只有在实际需要时才会被检索(如果关系被遍历)。

但是,如果您能够将 BLOB 作为资源存储在文件系统上,并维护到这些资源的链接(例如 URL 或路径),那就更好了。然后,您可以在必要时加载 BLOB。

【讨论】:

以上是关于在核心数据中存储图像的主要内容,如果未能解决你的问题,请参考以下文章

核心数据 - 存储图像(iPhone)[关闭]

核心数据 - 存储图像(iPhone)[关闭]

Xcode:从核心数据中的图像数据延迟加载图像

从核心数据记录在 uiwebview 中显示图像

核心数据和可转换以检索图像

排查核心数据死锁?