【问题标题】:Android - load data from database onceAndroid - 从数据库中加载数据一次
【发布时间】:2021-05-09 17:12:45
【问题描述】:

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

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

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

现在问题来了:

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

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

此外,我认为我的设计可能遗漏了 Android 中常见的一些东西,我很想听听它是什么。实现此类应用程序的正确方法是什么?

【问题讨论】:

    标签: android android-livedata android-viewmodel


    【解决方案1】:

    我认为存储库层在这种情况下会有所帮助。
    https://developer.android.com/jetpack/guide

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

    存储库可以是一个单例,用作简单的内存缓存。

    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,这是一个例子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-19
      • 2017-05-28
      • 1970-01-01
      • 1970-01-01
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多