将通过 Retrofit 获取的在线数据缓存到 Room 以供离线访问的方法
Ways to caching online data fetched through Retrofit into Room for offline access
我正在尝试设计一个可以在线和离线工作的应用程序,我需要设计一种本地缓存系统,我已经尝试了 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) 某种不需要删除数据库中的所有内容然后重新创建它的实现
考虑在这里看看我的回答。正如我告诉很多人的(我可能仍然会),当你学习新东西时,担心做某事的最佳方法几乎毫无意义,你应该首先让一些东西为你工作。
将 Room 用作缓存的典型方法是这样的,可能是:
- 从 api
中获取数据
- 将其插入房间数据库
- 从我的应用程序的房间中获取它
Room 允许您在本地存储数据并使用各种不同的线程检索这些数据,利用 Rxjava 之类的东西,它还允许您观察 LiveData 的任何变化,Room 绝对是一个值得考虑的不错选择在这种情况下缓存,尽管它是您可用的几种技术之一
我正在尝试设计一个可以在线和离线工作的应用程序,我需要设计一种本地缓存系统,我已经尝试了 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) 某种不需要删除数据库中的所有内容然后重新创建它的实现
将 Room 用作缓存的典型方法是这样的,可能是:
- 从 api 中获取数据
- 将其插入房间数据库
- 从我的应用程序的房间中获取它
Room 允许您在本地存储数据并使用各种不同的线程检索这些数据,利用 Rxjava 之类的东西,它还允许您观察 LiveData 的任何变化,Room 绝对是一个值得考虑的不错选择在这种情况下缓存,尽管它是您可用的几种技术之一