将数据从 Room 返回到 ViewModel,然后使用来自 webservice 的新数据更新 ViewModel

Returning data from Room to ViewModel and later update the ViewModel with new data from webservice

我有一个 ViewModel 并且我正在使用 LiveData,所以我有一个 DAO return LiveData> 我可以让它工作,但实际上我希望它首先显示来自 Room 数据库的数据如果有,然后当 web 服务有 returned 新数据(如果有的话)然后将其写入数据库,然后使用数据库中的最新数据更新 ViewModel。我首先从数据库中 return 获取数据,然后在后台将新数据写入数据库,但是我如何使用来自又是数据库?

谢谢
索伦

你可以DAOreturnLiveData<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 并在其中执行您的业务逻辑,提供离线优先数据,然后尝试从网络获取数据并更新数据库。