我有一个每30秒运行一次的功能,该功能从服务器中获取最新数据并本地存储。
当前,我将删除所有现有的行并再次重新插入所有数据,但是我认为这种方式不是有效的方法,只有在本地数据和本地数据都在的情况下,我才应该更新数据服务器数据延迟。
那我该怎么办?
这就是我在做什么:
DatabaseDao:
@Dao
public interface GeneralDatabaseDao {
@Query("DELETE FROM table_tables")
int deleteTables();
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertRestaurantTablesData(TablesModel... TablesModels);
}
存储库:
public LiveData<List<TablesModel>> getTablesData(int mLocationID) {
mTablesList = new MutableLiveData<>();
LiveData<TablesModel> mTablesData = mTableDataSource.getTablesData();
Observer<TablesModel> mObserver = tableModels -> {
mExecutors.diskIO().execute(() -> {
//Completed: delete old table data if there are conflicts.
if (tableModels != null) {
mDatabaseDao.deleteTables();
mDatabaseDao.insertTablesFromServer(tableModels.getTables());
} else {
Log.e(LOG_TAG, "Nothing: ");
}
});
Log.e("Handlers", "repository getTablesData");
};
if (!mTablesData.hasObservers()) {
mTablesData.observeForever(mObserver);
}
return mDatabaseDao.getTablesData(mLocationID);
}
我知道我需要将所有本地行与从服务器获取的数据进行比较,然后仅更新更改的数据,但是为此,我需要查询本地数据并在循环中逐行检查然后更新。我这样做很好,但是还有其他有效的方法吗?
答案 0 :(得分:0)
没有,别无选择。此外,如果您删除并再次插入,则每次都会激活UI刷新。由于您仅在需要时才使用实时数据来更新UI,因此仅在绝对必要时才需要更新数据库。
使用您编写的代码,每次检查Web服务时,UI都会刷新。最好每次都检查是否有要更改和修改的行。