android - 将数据插入数据库时​​,我没有收到对 onChange 的更改

标签 android mvvm kotlin android-livedata

我正在尝试使用 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/

相关文章:

random - 为什么使用nextInt()时要加0

android - 使用 Intent.ActionOpenDocumentTree 时,您可以允许用户保存在设备以外的位置吗?

android - 如何添加 2 个监听器映射?

android - 当 Android 中数组中的值超过 1 个时,Firestore whereArrayContains 不起作用

c# - 如何使用 MVVM 为用户偏好创建程序架构

.net - 在不同级别更改了InotifyPropertyChange的简单MVVM

android - 如何根据 Activity 切换 Intent 功能

wpf - MVVM:如果后台线程不断更改模型怎么办?

kotlin - 如何避免 kotlin Exposed 上的 N+1 查询问题。 (当通过 DAO 的 Reference.id.value 字段获取值时)

Android LiveData Observer 在性能方面的替代方案