当前位置: 首页 > 知识库问答 >
问题:

使用存储库模式从不同的数据源(网络和房间)返回数据列表到viewModel

唐法
2023-03-14

我有一个显示小行星列表的主要片段。

以下是我想要实现的流程。

  • 当用户打开主片段时,我会检查本地数据库(房间)中是否存储有小行星数据。
  • 如果是,我将显示存储的数据
  • 如果没有,我将调用API获取小行星,然后将数据从API存储到本地数据库
override suspend fun getAsteroid(): List<Asteroid> {
    var result : List<Asteroid>
    try {
        var isDataAvailable = getAnyAsteroidFromDb()
         if (isDataAvailable == null) {
             result = getAsteroidApi().asDomainModel()
         } else {
             result = getAsteroidFromDb()
         }
    } catch (e : Exception) {

    }
    return result
}

getaSteroidFromdb从room获取数据

问题是getaSteroidFromdb从Dao返回Livedata

 @Query("SELECT * FROM asteroid_tbl")
    fun getAsteroidsFromDb () : LiveData<List<AsteroidEntity>>

函数本身getAsteroid返回小行星列表。

共有1个答案

籍光熙
2023-03-14

对此有不止一种解决方案,但由于您使用的是MVVM模式。因此,我想建议你一个模式,为这种情况。

每当有一种情况下,必须检查我们的本地数据库或调用我们的后端API。通常的调用结构是只有一点数据源,以避免歧义和此类问题。

因此,虽然您可以轻松地从LiveData获得或将API响应转换为LiveData。我建议你们的结构如下。

    null
 类似资料:
  • 在viewmodel类中获取数据方法

  • 我有这样的查询,我想从中提取电影标题及其评级 但此列表显然不能存储具有2个值的结果集 在了解它之后,我发现例如这个链接Spring Data: JPA repository findAll()返回*Map而不是List?但我似乎不清楚它们的实现。 我不明白他们从哪里得到第一个链接中的长值 我如何创建我的地图? 电影类: 评级等级:

  • 我转换java代码到kotlin代码,我得到类型未解决的java类错误。 我的Java类是 已转换的Kotlin类 非常感谢。

  • Room存储数据库的位置以及如何强制重新生成数据库?我尝试在以下位置查找DB: 我想使用SQLLite看看数据库中到底有什么数据,所以我按照“Access database in Android Studio”的方向操作,但我只看到一个缓存和codecache目录存储在那里。没有数据库目录。 想要查看DB的原因是我更改了模型以添加几个字段,但我想不出如何强制使用Room来重新创建并用数据重新填充D

  • 我在资产文件夹中有一个。db文件。我的RoomDatabase类如下所示。我把应用程序安装到我的设备上。然后,我在下面的类中更改了version=2,并使我的预填充数据库版本为2。然后,我重命名了表中的一列,以便更改模式。然后我又安装了应用程序。然后嘣!Room给了我以下错误:Room无法验证数据完整性。看起来您已经更改了架构,但忘记更新版本号。您可以通过增加版本号来解决这个问题。 在这一点之后,

  • 我需要帮助设置一个应用程序,该应用程序将内部(主)MS SQL数据库DB1中的数据子集复制到另一个MySQL数据库DB2中,该数据库在Web服务器上运行,供Web应用程序使用(即,我想同步这两个数据库)。这两个数据库上的表具有相同的名称,尽管DB2上只定义了属性/列的子集。我想使用(xml配置的)spring、spring data jpa(即JpaRepository接口)和hibernate作