将数据从 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 获取数据,然后在后台将新数据写入数据库,但是我如何使用来自又是数据库?
谢谢
索伦
你可以DAO
returnLiveData<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
并在其中执行您的业务逻辑,提供离线优先数据,然后尝试从网络获取数据并更新数据库。
我有一个 ViewModel 并且我正在使用 LiveData,所以我有一个 DAO return LiveData> 我可以让它工作,但实际上我希望它首先显示来自 Room 数据库的数据如果有,然后当 web 服务有 returned 新数据(如果有的话)然后将其写入数据库,然后使用数据库中的最新数据更新 ViewModel。我首先从数据库中 return 获取数据,然后在后台将新数据写入数据库,但是我如何使用来自又是数据库?
谢谢
索伦
你可以DAO
returnLiveData<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
并在其中执行您的业务逻辑,提供离线优先数据,然后尝试从网络获取数据并更新数据库。