【问题标题】:Ways to caching online data fetched through Retrofit into Room for offline access将通过 Retrofit 获取的在线数据缓存到 Room 以供离线访问的方法
【发布时间】:2019-11-29 17:46:18
【问题描述】:

我正在尝试设计一个可以在线和离线工作的应用程序,我需要设计一种本地缓存系统,我已经尝试了 MVVM 实现并且能够使用 Room Persistence 从本地数据库中获取数据库,但我不确定如何从服务器获取数据并使其表现得像已经存储在数据库中的数据(即在本地缓存数据库中),任何帮助将不胜感激

我已经尝试实现改造并从中获取数据......但是我的实现会在每次打开数据库时从服务器获取数据,删除以前的数据并使用服务器中的数据库填充它,我不认为这是一个可行的实现,因为它需要删除和重新创建数据

class Repository {
private LiveData<List<User>> allUsers;
private static final String TAG = "Repository";
private UserDao userDao;

Repository(Application application) {
    DatabaseClass database = DatabaseClass.getInstance(application);
    userDao = database.databaseDAO();
    allUsers = userDao.getAllUsers();
    Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create()).build();
    RetrofitApi retrofitApi = retrofit.create(RetrofitApi.class);
    Call<List<User>> userCall = retrofitApi.get();

    userCall.enqueue(new Callback<List<User>>() {
        @Override
        public void onResponse(Call<List<User>> call, Response<List<User>> response) {
            List<User> userList = response.body();
            for (User user: userList
                 ) {
                user = new User(user.title,user.title,user.userId);
                insert(user);

            }
        }

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

        }
    });


}

public void insert(User user)
{
    new InsertIntoDatabase(userDao).execute(user);
}
public  void update(User user)
{
    new UpdateUser(userDao).execute(user);
}
public void delete(User user)
{
    new DeleteFromDatabase(userDao).execute(user);
}
public void deleteAllUser()
{
    new DeleteAllUsers(userDao).execute();
}
public LiveData<List<User>> getAllUsers()
{
    return allUsers;
}



static class InsertIntoDatabase extends AsyncTask<User,Void,Void>{
    public UserDao userDao;

    public InsertIntoDatabase(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    protected Void doInBackground(User... users) {
        userDao.insert(users[0]);
        return null;
    }
}

static class DeleteFromDatabase extends AsyncTask<User,Void,Void>{
    public UserDao userDao;

    public DeleteFromDatabase(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    protected Void doInBackground(User... users) {
        userDao.delete(users[0]);
        return null;
    }
}


static class DeleteAllUsers extends AsyncTask<Void,Void,Void>{
   UserDao userDao;

    public DeleteAllUsers(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    protected Void doInBackground(Void... voids) {
        userDao.deleteAllUsers();
        return null;
    }
}


static class UpdateUser extends AsyncTask<User,Void,Void>{
    UserDao userDao;

    public UpdateUser(UserDao userDao) {
        this.userDao = userDao;
    }

    @Override
    protected Void doInBackground(User... users) {
        userDao.updateUser(users[0]);
        return null;
    }
}

}

我所期望的如下所示 1)只有更新的数据应该存储在房间里 2)某种不需要删除数据库中的所有内容然后重新创建它的实现

【问题讨论】:

  • 我还没有尝试过..我是 android 新手,您认为这种方法是否可行...我的意思是如果我使用更新而不是插入

标签: android caching retrofit2 android-room


【解决方案1】:

How to use room database as a cache 考虑在这里查看我的答案。正如我已经告诉很多人(我可能仍然会)当你学习新东西时,担心做某事的最佳方式几乎毫无意义,你应该首先让一些东西为你工作。

使用 Room 作为缓存的典型方法是这样的,可能:

  1. 从 api 获取数据
  2. 将其插入房间数据库
  3. 从我的应用程序的房间中获取它

Room 允许您在本地存储数据并使用各种不同的线程检索这些数据,使用 Rxjava 之类的东西,它还允许您观察 LiveData 的任何更改,Room 绝对是考虑缓存的不错选择这种情况,尽管它是您可以使用的几种技术之一

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2018-11-29
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    • 2011-07-10
    • 2012-01-16
    相关资源
    最近更新 更多