【问题标题】:How to paginate through Room database with random order?如何以随机顺序对 Room 数据库进行分页?
【发布时间】:2021-04-13 09:21:52
【问题描述】:

所以我有一个项目列表,并且我已经像这样轻松地实现了分页功能:

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);

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

【问题讨论】:

    标签: android pagination android-room


    【解决方案1】:

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

    第一个: 是从您的 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 对于 subList 获取我认为从数据库返回的项目的顺序与 ID 的 subList 中的顺序不同,如果您想完全按照它们的顺序获取项目洗牌后的数组,我猜你需要一个一个地获取项目。

    【讨论】:

    • 这是一个非常好的主意。虽然我会等待更多,看看是否有任何内置的解决方案。
    • 有意思,我也跟着去。
    猜你喜欢
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-02-18
    • 2018-07-04
    • 1970-01-01
    • 2012-07-03
    • 1970-01-01
    相关资源
    最近更新 更多