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

How do I use GreenDao LazyList correct for huge amount of data + Sort and Filtering

我正在尝试在 android 列表视图中实现分页。

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

已经实施的内容:

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

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

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

我第一次查询 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 很痛苦。有一个更好的方法吗? (实际上我试过一次但没有成功)。

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

如果我点击一个按钮 "sort alphabetically" 它会在 GreenDAO QueryBuilder 中同时使用(edittext [for like] 和 ORDER)来加载一个新的惰性列表(比如 textwatcher + order 子句)。

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

在此处查看 "Limit, Offset, and Pagination" 部分:http://greenrobot.org/greendao/documentation/queries/