Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android架构组件如何结合来自数据库和网络的LiveData?_Android_Mvvm_Architecture_Android Architecture Components_Android Livedata - Fatal编程技术网

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

Android架构组件如何结合来自数据库和网络的LiveData?,android,mvvm,architecture,android-architecture-components,android-livedata,Android,Mvvm,Architecture,Android Architecture Components,Android Livedata,NetworkBoundResource中提供了一个示例,但当我试用它时,若数据库返回一个结果,它将不再从网络中获取。我想要的是同时显示来自数据库和触发网络的数据,并在网络完成后最终替换数据库中的数据。示例代码将不胜感激 我会使用房间数据库将您的项目保存在表中。然后使用分页列表观察该表。第一次观察该表时,也要向网络发出请求。收到响应后,从表中删除所有项并插入新项(所有这些都在存储库类和后台线程中)。最后一步将自动更新您的分页列表,因为您的分页列表正在观察房间表。我将使用房间数据库将您的项目保存在

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

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

我将使用房间数据库将您的项目保存在表中。然后使用分页列表观察该表。第一次观察该表时,也要向网络发出请求。收到响应后,从表中删除所有项并插入新项(所有这些都在存储库类和后台线程中)。最后一步将自动更新您的寻呼列表,因为您的寻呼列表正在观察该房间表。

我想这篇文章可能会有所帮助:

以及本文的GitHub回购协议:

此解决方案的核心是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) { }
                });
            }
        });
    }
public-LiveData-getUser(字符串userLogin){
refreshUser(userLogin);//如果可能,尝试从Github Api刷新数据
return userDao.load(userLogin);//直接从数据库返回LiveData。
}
// ---
私有用户(最终字符串userLogin){
执行者。执行(()->{
//检查是否最近提取了用户
布尔userExists=(userDao.hasUser(userLogin,getMaxRefreshTime(new Date())!=null);
//如果用户需要更新
如果(!userExists){
getUser(userLogin).enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
Toast.makeText(App.context,“数据从网络刷新!”,Toast.LENGTH_LONG.show();
执行者。执行(()->{
User=response.body();
user.setLastRefresh(新日期());
保存(用户);
});
}
@凌驾
public void onFailure(Call,Throwable t){}
});
}
});
}

我想这篇文章可能会有所帮助:

以及本文的GitHub回购协议:

此解决方案的核心是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) { }
                });
            }
        });
    }
public-LiveData-getUser(字符串userLogin){
refreshUser(userLogin);//如果可能,尝试从Github Api刷新数据
return userDao.load(userLogin);//直接从数据库返回LiveData。
}
// ---
私有用户(最终字符串userLogin){
执行者。执行(()->{
//检查是否最近提取了用户
布尔userExists=(userDao.hasUser(userLogin,getMaxRefreshTime(new Date())!=null);
//如果用户需要更新
如果(!userExists){
getUser(userLogin).enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
Toast.makeText(App.context,“数据从网络刷新!”,Toast.LENGTH_LONG.show();
执行者。执行(()->{
User=response.body();
user.setLastRefresh(新日期());
保存(用户);
});
}
@凌驾
public void onFailure(Call,Throwable t){}
});
}
});
}

with Room DATABASE发现此回购协议的简单而好的解决方案:with Room DATABASE发现此回购协议的简单而好的解决方案: