首页 > 解决方案 > 如何以随机顺序对 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);

到目前为止一切正常。但现在我希望能够显示也可以分页的随机项目。我怎样才能得到这个?

标签: androidpaginationandroid-room

解决方案


我相信您可以通过两种方式实现这一目标:

第一个:是通过从您的 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 中的顺序不同,如果你想完全按照它们在洗牌数组中的顺序来获取项目,我想你需要获取一件一件的物品。


推荐阅读