Is it a good practice to observeForever in Repository class? db+network paged list

泪湿孤枕 提交于 2020-06-26 03:23:31

问题


Im building an app following architecture guidelines.Implemented room db caching + network.Need to get latest page number from separate entity.

My model:

@Entity(tableName = "top_rated_movie_page")
public class Top_Rated_Movies_Page {

@PrimaryKey(autoGenerate = true)
private int db_id;
private Integer page;
private Integer total_results;
private Integer total_pages;
@Ignore
private List<Result> results;
...

Result class contains data which i display in my paged list which observes changes from db.

Using PagedList.BoundaryCallback i need to fetch new data from network and insert it into db. But i need to get page number somehow. My dao:

@Insert
void insertAll(Top_Rated_Movies_Page page,List<Result> top_rated_results);

@Query("SELECT * FROM Result")
DataSource.Factory<Integer, Result> getAllResults();

@Query("SELECT * FROM top_rated_movie_page WHERE page= (SELECT MAX(page) FROM top_rated_movie_page)")
LiveData<Top_Rated_Movies_Page> getMoviePage();

I was thinking to observe Top_Rated_Movies_Page from db in my repository class with observeForever() to get that page number. Is that the best way to approach this?


回答1:


Since the only time you'll read the next page key or update the backing DB is through BoundaryCallback, you can just read / write your next page key directly.

So in your onItemAtEndLoad() implementation you want something like:

String nextMoviePage = db.runInTransaction(() -> {
    movieDao.nextRemoteKey().key;
});

// Make sure not to run on main thread
MovieNetworkResponse response = networkApi.fetchNextMoviePage(remoteKey);

db.runInTransaction(() -> {
    movieDao.clearAll(); // Remove previous key
    movieDao.insertKey(RemoteKey(response.nextPageKey)); // Insert new key
    movieDao.insertAll(response.movies); // Update DataSource + invalidate()
});

Your DAO:

@Insert
void insertAll(List<Result> top_rated_results);

@Query("SELECT * FROM Result")
DataSource.Factory<Integer, Result> getAllResults();

@Query("SELECT * FROM result_key LIMIT 1")
String nextRemoteKey();

@Insert
void insertKey(RemoteKey remoteKey);

And don't forget to clear out both the items and remoteKey whenever you expect to refresh the data!

In the case where you want to keep track of different keys for query, you can simply add that column to your RemoteKey entity.

FYI: Paging2 has been superseded by Paging3 (though just launched alpha01), here is the similar Paging3 sample which solves exactly your use-case: https://github.com/android/architecture-components-samples/blob/master/PagingWithNetworkSample/app/src/main/java/com/android/example/paging/pagingwithnetwork/reddit/repository/inDb/PageKeyedRemoteMediator.kt



来源:https://stackoverflow.com/questions/62321170/is-it-a-good-practice-to-observeforever-in-repository-class-dbnetwork-paged-li

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!