Android 在Repository类中观察eForever是一种好的做法吗?db+网络分页列表

Android 在Repository类中观察eForever是一种好的做法吗?db+网络分页列表,android,android-livedata,android-architecture-components,android-mvvm,android-paging,Android,Android Livedata,Android Architecture Components,Android Mvvm,Android Paging,Im根据架构指南构建应用程序。实现了房间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 Integ

Im根据架构指南构建应用程序。实现了房间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;
...
我想用ObserveForver在我的repository类中观察db中的顶级电影页面,以获得该页码。
这是最好的方法吗

因为只有通过BoundaryCallback才能读取下一页键或更新备份数据库,所以您可以直接读取/写入下一页键

因此,在您的OnItemEndLoad实现中,您需要以下内容:

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()
});
你的刀:

@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);
当您希望刷新数据时,不要忘记清除项和remoteKey

如果希望跟踪不同的查询键,只需将该列添加到RemoteKey实体中即可


仅供参考:Paging2已被Paging3取代,尽管刚刚推出alpha01,但这里有一个类似的Paging3示例,它精确地解决了您的用例:

无论何时,只要您需要使用ObserveForver,而没有生命周期所有者,您应该改为使用Transformations.switchMap。当调用db.runInTransaction通过传递new Callable i get来获取nextMoviePage时,主线程上出现无法访问数据库的错误。如何在调用OnItemEndLoaded后立即使nextMoviePage可用?无法强制在主线程上运行锁定用户界面,但在这种情况下,您不需要为订购保证设置锁定。
@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);