首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从数据库加载数据一次

从数据库加载数据一次
EN

Stack Overflow用户
提问于 2021-05-08 16:30:10
回答 1查看 635关注 0票数 0

我编写了一个应用程序,用户可以在其中添加事件来跟踪某些活动。数据保存在Room数据库中。应用程序只有一个活动和使用片段。

我现在的实现如下:我有一个LiveData,它有一个接口来获取“所有条目”、“X类型的所有条目”和“带有特定ID的条目”。然后,当加载每个片段时,它从db检索所需的数据。有时需要更多的时间和更少的时间,但是等待数据加载可能会很烦人。

我一直在考虑将数据保存在内存中,每次用户更新某些内容时,我都会将其保存在内存和后台线程中,将其保存到数据库中。

现在谈一谈问题:

  • 最简单的解决方案是在应用程序启动时加载所有数据。用户会看到某种加载屏幕。然后,每次调用“获取数据”都会立即返回。问题是,这个加载时间可以是超长的,并且可以在用户开始使用应用程序时以块的形式完成。就像facebook中的加载提要一样,
  • 的第二个解决方案是在第一次请求时加载“按需”加载。正因为如此,在我的应用程序中的任何地方,我都会有一个类似模式的观察者,在LiveData中,通知数据已经准备好了。但是,只有在未加载数据时,我才希望它加载数据。

我正在搜索的是类似于LiveData的东西,但是它只加载数据一次,然后加载每个人,而不是每次--例如,一个返回LiveData的函数,它从db加载数据。

此外,我认为我的设计可能错过了一些在Android中很常见的东西,我很想知道它是什么。实现这种应用程序的正确方法是什么?

EN

回答 1

Stack Overflow用户

发布于 2021-05-09 09:12:45

在这种情况下,我认为存储库层是有帮助的。

https://developer.android.com/jetpack/guide

下面是假设您正在使用Kotlin的示例代码,courotin不需要监视数据库数据的变化。

存储库可以是作为简单内存缓存的单例。

代码语言:javascript
运行
复制
object Repository {
//private mutable liveData for internal usage
private val _data = MutableLiveData<String> ()

//public liveData exposed to fragment/viewModel
val data: LiveData<String>
get() {
    if (_data.value==null)
        GlobalScope.launch(Dispatcher.IO){
            fetchData()
        }
    return _data
}

suspend fun fetchData(){
    //get data from Dao
    val dataFromDatabase = "123"
    //assign the data retrieved to the liveData
    _data.value = dataFromDatabase
}
}

您可以在加载屏幕中调用fetchData,并在需要数据的其他片段中访问数据。

如果您需要监视数据库中的数据更改,Room实际上可以返回一个LiveData/Flow,当数据发生更改时,它会更新该值。https://developer.android.com/codelabs/android-room-with-a-view-kotlin#8,这是一个例子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67449808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档