【问题标题】:Returning data from Room to ViewModel and later update the ViewModel with new data from webservice将数据从 Room 返回到 ViewModel,然后使用来自 web 服务的新数据更新 ViewModel
【发布时间】:2019-09-17 12:51:18
【问题描述】:

我有一个 ViewModel 并且我正在使用 LiveData,所以我有一个返回 LiveData 的 DAO> 我可以让它工作,但如果有的话,我真的希望它首先显示 Room 数据库中的数据,并且然后当 web 服务返回新数据(如果有的话)然后将其写入数据库,然后使用数据库中的最新数据更新 ViewModel。我首先从数据库中返回数据并在后台将新数据写入数据库,但是如何让 ViewModel 再次读取/更新数据库中的新数据?

谢谢
索伦

【问题讨论】:

    标签: android android-room android-livedata


    【解决方案1】:

    您可以让您的DAO 返回LiveData<Any>。这意味着您可以收到有关该实体的每次更改的通知。

    假设您有一个User 实体:

    @Entity
    data class User(
        @PrimaryKey(autoGenerate = true) var uid: Int = 0,
    
        @ColumnInfo(name = "name")
        val name: String
    )
    

    其相关的DAO如下:

    @Dao
    interface UserDao {
    
        @Query("SELECT * FROM user")
        fun all(): LiveData<List<User>>
    
        @Insert
        suspend fun insert(vararg users: User)
    }
    

    所以,你只需要将all 的结果暴露给你的视图层:

    class UserViewModel : ViewModel() {
    
        val users: LiveData<List<User>> = userDao.all()
    }
    
    class UserActivity : AppCompatActivity() {
        private val viewModel by viewModels<UserViewModel>()
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
    
            viewModel.users.observe(this, Observer { users ->
                // show data
            })
        }
    }
    

    现在如果你插入一个新的User,你的观察者将会被调用。

    这是如何从 DAO 获取更新数据的基本思路。但在您的情况下,您实际上必须做的是创建一个 Repository 并在其中执行您的业务逻辑,提供离线优先数据,然后尝试从网络获取数据并更新数据库。

    【讨论】:

    • 谢谢你,我把这件事颠倒过来了,但你让我回到了正轨。
    猜你喜欢
    • 2012-10-04
    • 1970-01-01
    • 2018-02-10
    • 2014-08-09
    • 2017-02-13
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    相关资源
    最近更新 更多