我按照架构指引构建了一个应用.实现了房间db缓存+网络.需要从独立实体获取最新的页码。
我的model.class包含了数据,我将其显示在我的paged list中,观察db的变化。
@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
类包含的数据,我显示在我的paged list中,观察db的变化。
使用 PagedList.BoundaryCallback
我需要从网络中获取新的数据并将其插入到数据库中,但我需要以某种方式获取页码。
@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();
我想观察 Top_Rated_Movies_Page
从我的仓库类中的db中用 observeForever()
我是按照架构指南来构建一个应用程序,实现了房间db缓存+网络,需要从单独的实体中获取最新的页码,这是最好的方法吗?
因为只有在你读取下一个页键或者更新后盾DB的时候,才会通过 BoundaryCallback
,你可以直接读写你的下一页键。
所以在你的 onItemAtEndLoad()
实现你想要的东西。
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()
});
你的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);
不要忘了每当你想刷新数据的时候 都要把 items 和 remoteKey 清空!
如果你想跟踪不同的查询键,你可以简单地将该列添加到你的RemoteKey实体中。
顺便说一下:Paging2已经被Paging3取代了(虽然刚刚推出alpha01),这里有类似的Paging3示例,它正好解决了你的用例。https:/github.comandroidarchitecture-components-samplesblobmasterPagingWithNetworkSampleappsrcmainjavacomandroidexamplepagingpagingwithnetworkredditrepositoryinDbPageKeyedRemoteMediator.kt。