android - 如何以随机顺序对 Room 数据库进行分页?
问题描述
所以我有一个项目列表,我已经很容易地实现了分页功能,如下所示:
b.rcvItems.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
if (dy > 0) {
int threshold = 20;
int count = adapter.getItemCount();
LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
int lastVisible = layoutManager.findLastVisibleItemPosition();
if (state != STATE_LOADING && (lastVisible >= count - threshold)) {
loadItems(items.size());
}
}
}
});
在这里我加载项目:
private void loadItems(int from) {
final int COUNT = 50;
items.addAll(new ArrayList<>(database.itemDAO().getSome(COUNT, from, true)));
updateView();
}
这是我的查询:
@Query("SELECT * FROM item ORDER BY id DESC LIMIT :count OFFSET :offset")
List<Item> getSome(int count, int offset);
到目前为止一切正常。但现在我希望能够显示也可以分页的随机项目。我怎样才能得到这个?
解决方案
我相信您可以通过两种方式实现这一目标:
第一个:是通过从您的 Room 数据库中获取所有项目,打乱项目列表,并在此列表上分页。虽然,当您的数据库中有大量行时,这种方式是不可能的。
第二个:是从 Room 数据库中获取所有行的 ID,如下所示:
@Query("SELECT item_id FROM item")
List<Integer> getAllIDs();
然后,打乱你得到的 ID 列表,并在 ID 列表上分页,如下所示:
@Query("SELECT * FROM item WHERE item_id IN (:ids)")
List<Item> getItemsWithIDs(List<Integer> ids);
// you had your shuffled IDs in allIDList
private void loadItems(int from) {
final int COUNT = 50;
List<Integer> subList = allIDList.subList(from, from + COUNT)
items.addAll(new ArrayList<>(database.itemDAO().getItemsWithIDs(subList)));
updateView();
}
PS for the subList fetching 我认为从数据库返回的项目的顺序与 ID 的 subList 中的顺序不同,如果你想完全按照它们在洗牌数组中的顺序来获取项目,我想你需要获取一件一件的物品。
推荐阅读
- c++ - 使用后增量构造带有变量的整数对 std::pair
- logistic-regression - Logistic Regression Predict Proba 错误无法弄清楚为什么?
- python - 为什么 Numba 在使用 numpy 随机随机播放时会扭曲我的 dtype 数组?
- bootstrap.min.css - 我没有找到我的引导程序。我的 dist 文件夹中的 min.css 文件?
- python - 使用 Python 抓取错误 - 使用请求
- python - 为什么 scipy.optimize.minimize 不适用于约束和初始值 0
- c# - While 循环无意间中断
- git - git fetch 后获取多少个分支
- mysql - 在 directus 无头 cms 中执行存储过程
- reactjs - 在 React 中第二次单击时,按钮功能不起作用