使用 coredata 存储/缓存非标准数据类型

Posted

技术标签:

【中文标题】使用 coredata 存储/缓存非标准数据类型【英文标题】:using coredata for storing / caching non standard data types 【发布时间】:2011-02-18 14:16:14 【问题描述】:

我正在重新研究在 iphone 上存储非标准类型(字符串、int16 等)的最佳方法。 我最终要做的是下载一个 xml 文件并存储日期、标题、名称、mediaurl 等值。我刚刚发现了 coredata 数据模型,我相信它会是存储此类数据的理想选择,因此下次应用启动时我不必下载 xml。

我不确定的是我可以在实体中存储的内容的限制(如果有的话)。例如,其中一个 xml 元素将包含一个指向一小段音频(小于 1mb)的 url 和一个指向图像的 url。将音频数据、图像作为属性存储在实体中是否合适,还是应该将其保存为字符串和整数等以及存储在其他地方的非标准类型?

我想我真正要问的是,数据模型是否适合缓存?

我最终要寻求的是一种解决方案,用于将设备上的数据存储在不与任何视图相关联的位置,有点像原子模型,包含我需要的一切,无论我是什么视图,我都可以深入了解在。

【问题讨论】:

【参考方案1】:

数据模型适用于缓存,但由于您没有对缓存的显式控制(您可以对数据对象进行故障处理,但它可能会保留在内存中),因此建议分离非常大的二进制对象。将它们作为资源存储在文件系统中,并在 Core Data 中管理它们的链接(URL 或路径)。

另外,如果你确实在 Core Data 中存储大文件,你应该使用 SQLite 存储。

【讨论】:

我同意并补充说您应该(如果您还没有)看看 Apple 的核心数据编程指南。此外,要在 Core Data 中存储诸如音频数据之类的内容,您需要使用 NSData - 上面提到的关于大小的警告。最后,如果您选择将 BLOB 存储在 Core Data 中,建议您将实际数据存储在与对象元数据不同的实体中,以避免不必要/不需要的大数据块加载。 感谢您的建议。我想我会看看 SQLLite 的东西。【参考方案2】:

上述来自 MHC 的答案很好,但是如果您存储不需要索引的大型二进制对象(无论如何都不能在 SQLite 中完成),推荐的方法是将实际数据存储在某处在文件系统上(例如,在 NSDocumentsDirectory 中),并将文件的路径存储在 Core Data 实体中。

Core Data 将获取的对象的所有部分加载到内存中,对于少数具有二进制数据的实体实例,这可能会很快导致您在 ios 设备上耗尽内存。

如果它存储在文件系统中,您可以在需要时延迟加载数据。

【讨论】:

我应该说二进制对象的索引不能在Core Data中完成。 SQLLite 支持列上的 B+ 树索引(在 Core Data 中 - 您可以设置要从模型编辑器索引的属性),但是使用 B+ 树索引 BLOB 并不是一件有用的事情。

以上是关于使用 coredata 存储/缓存非标准数据类型的主要内容,如果未能解决你的问题,请参考以下文章

iOS swift:使用 coredata (cloudkit) 存储缓存

如何在 Core Data(例如 NSRect)中存储非标准的持久属性?

是否需要缓存CoreData返回的数据?

mysql往数据库插入float类型的数据 为啥数字不对?

使用Redis在Hibernate中进行缓存

CoreData:持久和临时存储