Android MVVM ROOM 单一事实来源问题

问题描述 投票:0回答:1

关于单一事实来源谷歌文档说:

使用此模型,数据库充当单一事实来源,应用程序的其他部分使用我们的 UserRepository 访问它。无论您是否使用磁盘缓存,我们都建议您的存储库指定一个数据源作为应用程序其余部分的单一事实来源

https://developer.android.com/jetpack/guide?gclid=CjwKCAjwo4mIBhBsEiwAKgzXOH1Pq--Ws1PLzUiSP4RmDE6ByKfEi6mdXu5g86btqveIdJvvrgYuxBoCz8wQAvD_BwE&gclsrc=aw.ds#connect-viewmodel-repository

根据文档,当我从远程服务器获取数据时,我保存所有数据,并且仅当我需要在活动中使用时从房间获取数据(实际上我收集在视图模型中定义的流)。

看起来真不错!它避免了不同的数据源混合在一起!但实际上我逐渐发现了一些奇怪的问题:

在我的应用程序中,我有一个服务器可以更改它的列表(因为我们有数据管理器网站,管理员可以更新或删除数据)。因此,为了从服务器获取最新的列表数据,我必须清除房间中存储的所有数据并再次从远程服务器获取数据。这个操作似乎多余:“为什么我可以直接从远程服务器获取数据”,我的意思是,我只从远程源获取数据也是单一来源的事实。它还会导致一个问题:我的应用程序会闪烁一会儿,因为清除数据会使列表变空并从服务器获取数据使列表变满!

最重要的是,似乎本地数据不是必需的,因为我必须保留来自远程服务器的最新列表。 有人可能会说,将数据保存到房间可以让我们的应用程序离线使用。我同意,但在这个地方,我的列表项代表一个图像 url,单击该项目后,应用程序将跳转到一个新活动并根据我们从列表中获取的 url 显示一个 ImageView。如果应用程序离线,ImageView 也无法加载 url。

我很困惑,我也无法立即加载所有图像网址(使用base64-url以避免加载无效),因为数据太多了。如果我说我需要这个列表中的搜索功能并且我需要将如此多令人难以置信的数据加载到我的房间中,这看起来是如此不真实和事件幻想!

简单来说:

房间是必须的吗?无法从远程获取数据吗?

如果需要空间,我遇到的问题如何解决,是我的错误使用导致的问题吗?

android kotlin android-room
1个回答
1
投票

嗨@psycongroo,因为我理解你的问题,我想分享我的经验:

  1. 您可以通过使用占位符加载 URL 来处理任何错误,我的意思是,如果您在没有互联网连接的情况下出现错误,用户将看到占位符,但一般来说,像 Picasso 或 Glide 这样的库可以在加载一次时缓存图像,因此用户将看图片。
  2. 关于为什么我们需要使用 room 而不是直接从远程获取数据的问题。因此,从您的问题来看,我不明白为什么您需要删除本地更改,即使它们是全新的,用户的互联网连接可能较低,因此他会看到一个空列表,而不是带有进度指示器等先前数据。此外,如果用户根本没有互联网,您可以显示一些对话框来解释问题所在,但旧数据仍然存在。例如,如果您使用的是 RecyclerView,您可以使用 Google 的 Paging 3 更新数据,它们只会更新列表中必需的项目。 附:如果有帮助,请告诉我,或者您还有其他问题。
© www.soinside.com 2019 - 2024. All rights reserved.