除了 ROOM,在 Android 中缓存数据的最佳方式是啥?

Posted

技术标签:

【中文标题】除了 ROOM,在 Android 中缓存数据的最佳方式是啥?【英文标题】:What is the best way to cache data in Android other than ROOM?除了 ROOM,在 Android 中缓存数据的最佳方式是什么? 【发布时间】:2021-05-17 03:09:03 【问题描述】:

这个问题可能是少数人的解决方案,但在这里尝试讨论缺点。

我有一个项目,我在其中使用 ROOM 来缓存服务器响应。虽然它是缓存数据的几种技术之一,但与其担心做某事的最佳方式,不如让我们开始(因为我需要查询要显示的特定存储数据)并构建整个项目在 ROOM 上作为缓存技术。我现在在做什么,

第一次通话,

    从 API 获取数据。 根据需要处理数据。 将其插入 ROOM 数据库。 从 ROOM 中获取它以显示。

缓存数据可用的后续调用,

    从 API 获取数据同时显示 ROOM 中的缓存数据。 用新的响应更新 ROOM DB。 更新用户界面。

我绝对同意上述逻辑在大多数情况下都能完美运行。

但是这里还有一个缺点。至此,我的项目已经变得庞大,显示的每一个数据都依赖于 ROOM DB。我所做的每个版本都会在表中进行一些或其他更改,我需要为其编写迁移。现在我的应用用户分布在 5 到 6 个不同版本的应用中。应用的可维护性变得越来越昂贵。

我的问题是,

    是否有更好的方法来处理迁移复杂性? 如果我将时间花在 REVAMP 上,除了 ROOM 缓存之外,我还应该考虑什么 我的缓存逻辑?

我希望我能够解释我的问题,感谢您在我的问题上花费的时间。

【问题讨论】:

【参考方案1】:

我不确定这是否真的有帮助.. 但是如果你说你的表结构不断变化,那么也许你可以考虑将数据(假设它的 JSON)写入应用程序的缓存文件夹中的文件并从中读取。android 确实为我们提供了一个缓存文件夹,我们可以在其中创建临时文件等,这样,如果结构有任何变化,您就不必担心迁移,因为数据将写入文件并直接从中读取。因此,您的模型中的更改足以满足此要求。这将变得类似于 NoSQL,但我不确定 android 本身是否支持 NoSQL。 这种文件读/写方法也没有很明显的延迟或处理时间。 但是,如果您想使用 ROOM 持久性库,那么是的,您必须为结构中的每一次更改处理迁移..

【讨论】:

随之而来的是另一个挑战。假设我们将响应存储在 json 中,每次我需要从列表中的 10000 中获取单个项目时,我都需要正确处理整个文件/部分。对此有何建议? @AjayJG 希望对您有所帮助。因此,在我以前的项目中,我尝试了这种做法,其中所有基于标准的属性都是我的表的一部分,而变量数据是我用来写入缓存 PRIVATE_MODE 的 json 文件,因此它们对用户也不可见。我将这些文件的路径存储在特定行中。这在某种程度上帮助了我,当我想选择一个特定的行时,在 SQLite 的帮助下,我能够做到这一点,然后从数据路径中读取文件。因此,无需读取 1000 个文件,只需获取行、列中的路径和文件中的数据即可。 在我们有固定标准的情况下效果很好,在我的情况下,用户可以像亚马逊的过滤器部分一样拥有多个组合(其中包含更多类别)。但是转移到文件或两者结合的一种方法是有意义的,试图找出其他解决方案。

以上是关于除了 ROOM,在 Android 中缓存数据的最佳方式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在使用 Android 架构组件和 Room 时将数据插入外部源/数据库

在 Android 上使用 Firestore 的缓存策略

Room----Android数据库(SQLite)

Android学习笔记 94. 从 Room 数据库中删除数据

Android Room 数据库中的查询支持

Android Room:使用 Room 插入关系实体