仅当服务器更改数据时才更新房间数据

时间:2018-10-11 07:01:23

标签: android android-sqlite android-room android-architecture-components

我有一个每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);
}

我知道我需要将所有本地行与从服务器获取的数据进行比较,然后仅更新更改的数据,但是为此,我需要查询本地数据并在循环中逐行检查然后更新。我这样做很好,但是还有其他有效的方法吗?

1 个答案:

答案 0 :(得分:0)

没有,别无选择。此外,如果您删除并再次插入,则每次都会激活UI刷新。由于您仅在需要时才使用实时数据来更新UI,因此仅在绝对必要时才需要更新数据库。

使用您编写的代码,每次检查Web服务时,UI都会刷新。最好每次都检查是否有要更改和修改的行。