【发布时间】: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