编程语言
首页 > 编程语言> > java-如何正确使用GreenDao LazyList处理大量数据并进行排序和过滤

java-如何正确使用GreenDao LazyList处理大量数据并进行排序和过滤

作者:互联网

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

背景:我通过网络服务下载了约6万个数据集,并使用GreenDao将其保存到SQLite数据库中.现在,我想在ListView中访问此60k行,然后选择一些(0-10).所选项目将发送到仅包含所选内容的另一个ListView.所有60k条目的db条目约为3 MB.

已实施的内容:

> SQLite数据库
> DAO
>列表视图
>适配器
> Transferlogic数据ListView->所选数据列表视图

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

由于LazyList不允许更改列表(删除,添加,清除)

我做了以下事情:
ListView有一个Adapter类,该类使用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是很痛苦的.有一个更好的方法吗? (实际上,我尝试过一次,但是没有用).

我需要这些值是可搜索的(通向许多条目),并且它必须是可排序的.

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

解决方法:

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

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

标签:greendao,sqlite,paging,java,android
来源: https://codeday.me/bug/20191119/2032925.html