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!