1

I'm trying to write applications with mvvm architecture. But I do not receive changes in onChange when I insert data into a database. The logic that I want to achieve: Go to the cache, take the data. Then we go to the server and receive data. If there are changes, update both the cache and ui. Tell me what I'm doing wrong?

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
    }
}

ViewModel class

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)
            }
        }

    }
}

Repository class

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

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 class

@Dao
interface PagesDao {

    @Query("SELECT * FROM pages WHERE pageName= :pageName")
    fun getPage(pageName: String): PageDb

}

Entity data class

@Entity(tableName = "pages")
data class PageDb(

        var content: List<Any>,
        @PrimaryKey(autoGenerate = false)
        var pageName: String

)

I would also like to hear criticism of this code. Thanks!

1 Answers1

0

Found what the problem was ... In order for LiveData to be notified of data changes, the method for retrieving data from the database should not have the suspend keyword.