我有一个ViewModel,我正在使用LiveData,所以我有一个返回LiveData的DAO>我可以让它工作,但实际上我希望它首先显示来自Room数据库的数据(如果有的话(,然后当Web服务返回新数据(如果有的话(时,然后将其写入数据库,然后使用数据库中的最新数据更新ViewModel。我首先从数据库中返回数据,并在后台将新数据写入数据库,但是如何让 ViewModel 再次使用数据库中的新数据读取/更新?
谢谢索伦
你可以让你的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
并在内部执行业务逻辑,提供脱机优先数据,然后尝试从网络获取数据并更新数据库。