Правильный способ обновления данных с помощью библиотеки подкачки - база данных + сеть - PullRequest
0 голосов
/ 16 мая 2019

У меня есть список сообщений, которые я получаю с помощью модернизации. Я использую библиотеку Android-пейджинга для получения 20 сообщений за раз.

Допустим, я второй раз открываю приложение. У меня уже есть 2 сообщения в базе данных, одно из которых удалено с сервера.

Как только я начинаю деятельность, я запрашиваю новые данные, используя BoundaryCallback. Прежде чем я получу новые данные, я удаляю данные, которые находятся в базе данных, которая вызывает проблему. Поскольку я использую обратный вызов границы, пустые данные показываются пользователю в виде изображения «Нет записей», а затем отображаются новые данные.

Я пытаюсь избежать обновления, которое показывает представление без записей.

Это действительно раздражает, в прошлом году я скачал образцы компонентов архитектуры GitHub из Google без подкачки страниц, и они попытались избежать этой проблемы в примере приложения, а не решить ее. Короче говоря, они не удалили старые данные, а получили новые. Возможно, образцы из Google всегда неполные или они ожидают, что мы добавим для этого собственную реализацию (я не верю этому «или»).

Вместо удаления я попытался использовать стратегию конфликта, чтобы заменить существующие данные. Но я обнаружил, что он не удаляет старый.

// BoundaryCallback file

class PostBoundaryCallback (

    ):
    PagedList.BoundaryCallback<Post>() {


    private var lastRequestedPage = 1

    init {
        if(reset) {
            // Deleting when flag is reset
            appExecutors.diskIO().execute {
                repository.delete(groupId)
            }
            lastRequestedPage = 1
        }
    }

    override fun onZeroItemsLoaded() {
        repository.requestAndSaveData(groupId, lastRequestedPage, userId)
    }

    override fun onItemAtEndLoaded(itemAtEnd: Post) {
        if(reset) {
            lastRequestedPage = 1
            reset = false
        } else {
            lastRequestedPage += 1
        }

        repository.requestAndSaveData(groupId, lastRequestedPage, userId)
    }

}

// Файл ViewModel


var postsForUser : LiveData<PagedList<Post>> = Transformations.switchMap(_resetAllPostsForUser) {

        val factory = postDao.allPostsForUserWith(it.first)
        factory.create()
        val boundaryCallback = PostUserBoundaryCallback(it.first, repository, it.second, appExecutors)
        LivePagedListBuilder(factory, 10)
            .setBoundaryCallback(boundaryCallback)
            .setFetchExecutor(appExecutors.diskIO())
            .build()
        }

// Деятельность

viewModel.posts.observe(this, Observer {
            if(it.isNullOrEmpty()) {
                noPostsLayout.visibility = View.VISIBLE
            } else {
                noPostsLayout.visibility = View.GONE
            }
            adapter.submitList(it)
            if (swipeRefreshLayout.isRefreshing ) {
            dswipeRefreshLayout.isRefreshing = false
}
            hideProgressView()
})
...