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