我正在尝试使用 mvvm 架构编写应用程序。但是当我将数据插入数据库时,我没有收到 onChange 的变化。我要实现的逻辑:去缓存,取数据。然后我们去服务器接收数据。如果有变化,更新缓存和用户界面。告诉我我做错了什么?
class PageFragment : BaseFragment() {
private val pageName= "fly"
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
...
val viewModel = ViewModelProviders.of(this).get(PageViewModel(activity!!.appliacation)::class.java)
viewModel.getPages().observe(this, Observer<Page> { page ->
adapter.contents = page!!.content
})
viewModel.pageName = pageName
return view
}
}
View 模型类
class PageViewModel constructor(application: Application) : AndroidViewModel(application) {
private var repository: Repository = Repository(application)
private var mutablePages = MutableLiveData<Page>()
fun getPages(): LiveData<Page> = mutablePages
var pageName: String = ""
set(value) {
field = value
loadData(value)
}
private fun loadData(pageName: String) {
GlobalScope.launch {
withContext(Dispatchers.Main) {
mutablePages.value = repository.getPage(pageName)
}
}
}
}
存储库类
class Repository(context: Context) {
private var dbRepository: DbRepository = DbRepository(context)
....
suspend fun getPage(pageName: String): Page =
dbRepository.getPage(pageName).let { pagesMapper.dbToBusinessEntity(it) }.also {
//get data from the server and put it into db
//data from the server put into db successful. By this I will not write how I do it.
GlobalScope.launch { updatePage(pageName) }
}
....
}
DbRepository 类
class DbRepository(context: Context) {
private var pagesDao: pagesDao = AppDatabase.getInstance(context).pagesDao()
....
suspend fun getpage(pageName: String): PageDb =
GlobalScope.async { pagesDao.getPage(pageName) }.await()
....
}
道类
@Dao
interface PagesDao {
@Query("SELECT * FROM pages WHERE pageName= :pageName")
fun getPage(pageName: String): PageDb
}
实体数据类
@Entity(tableName = "pages")
data class PageDb(
var content: List<Any>,
@PrimaryKey(autoGenerate = false)
var pageName: String
)
我也想听听对这段代码的批评。谢谢!
最佳答案
找到问题所在... 为了让 LiveData 得到数据变化的通知,从数据库中检索数据的方法不应该有 suspend 关键字。
关于android - 将数据插入数据库时,我没有收到对 onChange 的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53630434/