Android架构组件如何组合来自数据库和网络的LiveData?

时间:2017-11-03 08:23:02

标签: android mvvm architecture android-architecture-components android-livedata

NetworkBoundResource中提供了一个示例,但是当我尝试它时,如果数据库返回结果,它就不再从网络中获取了。我想要的是同时显示来自数据库和触发网络的数据,并在网络完成后最终替换数据库中的数据。示例代码将非常感谢。

2 个答案:

答案 0 :(得分:0)

我会使用会议室数据库将您的项目保存在表格中。然后使用分页列表观察该表。第一次观察该表时,也请求进行网络连接。当您收到响应时,从表中删除所有项并插入新项(所有这些都在存储库类和后台线程中)。当您的分页列表正在观察该房间表时,最后一步将自动更新您的分页列表。

答案 1 :(得分:0)

猜猜这篇文章可能会有所帮助: https://proandroiddev.com/the-missing-google-sample-of-android-architecture-components-guide-c7d6e7306b8f

和本文的GitHub存储库: https://github.com/PhilippeBoisney/GithubArchitectureComponents

此解决方案的核心是UserRepository:

public LiveData<User> getUser(String userLogin) {
        refreshUser(userLogin); // try to refresh data if possible from Github Api
        return userDao.load(userLogin); // return a LiveData directly from the database.
    }

    // ---

    private void refreshUser(final String userLogin) {
        executor.execute(() -> {
            // Check if user was fetched recently
            boolean userExists = (userDao.hasUser(userLogin, getMaxRefreshTime(new Date())) != null);
            // If user have to be updated
            if (!userExists) {
                webservice.getUser(userLogin).enqueue(new Callback<User>() {
                    @Override
                    public void onResponse(Call<User> call, Response<User> response) {
                        Toast.makeText(App.context, "Data refreshed from network !", Toast.LENGTH_LONG).show();
                        executor.execute(() -> {
                            User user = response.body();
                            user.setLastRefresh(new Date());
                            userDao.save(user);
                        });
                    }

                    @Override
                    public void onFailure(Call<User> call, Throwable t) { }
                });
            }
        });
    }