如何使用GreenDao LazyList正确处理大量数据+排序和过滤

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

我正在尝试在android listview中实现分页。

背景:我通过 Web 服务下载大约 60k 数据集,并使用 GreenDao 将它们保存到 SQLite 数据库中。现在我想在 ListView 中访问这 60k 行并选择一些(0-10)。所选项目将发送到另一个仅包含所选内容的 ListView。所有 60k 条目的数据库条目约为 3 MB。

已实施的内容:

  • SQLite 数据库
  • DAO
  • 列表视图
  • 适配器
  • Transferlogic 数据列表视图 --> 选定的数据列表视图

ListView 显示在 DialogFragment 中。我想到了使用 GreenDao LazyList 类的想法,因为这个列表可以加载单个项目,而不需要直接加载所有项目。

因为 LazyList 不允许更改列表(删除、添加、清除)

我做了以下事情: ListView 有一个 Adapter 类,它在 DialogFragment 中使用 java.util.List 我查询 LazyList(获取全部)或使用 EditText 来应用类似子句。

第一次查询 60k 条目时,我将前 50 个条目加载到适配器中,并将它们显示在 ListView 中。我不想稍后使用导航栏来更改项目。

我希望 EditText 在用户输入时直接工作,所以我添加了一个 TextChangeListener。

edittext.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {

        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
        }

        @Override
        public void afterTextChanged(Editable s) {
            if(lazyList != null) {
                if(!lazyList.isClosed()) {
                    lazyList.close();
                    lazyList = null;
                }
            }

            if(s.length() <= 1) {
                QueryBuilder qb = session.getCodeSystemDao().queryBuilder();
                lazyList = qb.listLazyUncached();
                resetListView();
            }
            else {
                QueryBuilder qb = session.getCodeSystemDao().queryBuilder();
                qb.where(DataDao.Properties.Value.like("%"+s.toString()+"%"));
                lazyList = qb.listLazyUncached();
                resetListView();
            }
        }
    });

问题是:当只输入 1-4 个字符时,列表不会显示,因为光标内存已满,请参阅日志:

W/CursorWindow: Window is full: requested allocation 48 bytes, free space 19 bytes, window size 2097152 bytes

我可以在关闭列表后使用 GC,但在 java 中直接使用 GC 很痛苦。有更好的方法吗? (实际上我尝试过一次但没有成功)。

我需要可搜索的值(许多条目的方式)并且它必须是可排序的。

如果我单击“按字母顺序排序”按钮,它会同时使用 GreenDAO QueryBuilder 中的(edittext [for like] 和 ORDER)来加载新的惰性列表(如 textwatcher + order 子句)。

java android sqlite pagination greendao
1个回答
4
投票

您可能不应该在这里使用 LazyList。分页通常通过使用 LIMIT 和 OFFSET 参数的查询来完成。

在此处查看“限制、偏移和分页”部分:http://greenrobot.org/greendao/documentation/queries/

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