将图像存储在核心数据中

时间:2011-07-19 23:15:02

标签: ios core-data

我们应该使用核心数据存储图像吗?这被认为是一种好习惯吗?我认为它可能具有较少的内存占用量,因为核心数据会在实际访问之前对对象进行故障。

2 个答案:

答案 0 :(得分:1)

这不太理想。

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

一种选择是存储文件名。

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

答案 1 :(得分:0)

实际上根据Apple文档,您应该根据文件大小使用核心数据:请参阅本章有关核心数据编程指南:

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(请参阅“持久存储功能”(第126页))这意味着它们无法有效处理大型数据对象。 SQLite可以扩展以处理极大的数据库。如果使用得当,SQLite可为高达100GB的数据库提供良好的性能,单行最多可容纳1GB(当然,无论存储库的效率如何,将1GB的数据读入内存都是一项昂贵的操作)。

     

BLOB通常表示实体的属性 - 例如,照片可能是Employee实体的属性。对于小到中等大小的BLOB(和CLOB),您应该为数据创建一个单独的实体,并创建一个到一个关系来代替该属性。例如,您可以创建Employee和Photograph实体,它们之间具有一对一的关系,其中Employee与Photograph之间的关系取代了Employee的相片属性。此模式可最大限度地发挥对象故障的优势(请参阅“故障和取消”(第110页))。只有在实际需要时才会检索任何给定的照片(如果遍历关系)。

     

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