在Repository类中观察Forever是一个好的做法吗? db+network分页列表

问题描述 投票:3回答:1

我按照架构指引构建了一个应用.实现了房间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缓存+网络,需要从单独的实体中获取最新的页码,这是最好的方法吗?

android android-livedata android-architecture-components android-mvvm android-paging
1个回答
2
投票

因为只有在你读取下一个页键或者更新后盾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。

© www.soinside.com 2019 - 2024. All rights reserved.