我如何使用 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。
已经实施的内容:
- SQLite 数据库
- DAO
- 列表视图
- 适配器
- Transferlogic 数据列表视图 --> 选定的数据列表视图
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/
我正在尝试在 android 列表视图中实现分页。
背景:我通过网络服务下载了大约 6 万个数据集,并使用 GreenDao 将它们保存到 SQLite 数据库中。现在我想访问 ListView 中的这 60k 行和 select 一些 (0-10)。 selected 项被发送到另一个仅包含 selection 的 ListView。所有 60k 条目的数据库条目约为 3 MB。
已经实施的内容:
- SQLite 数据库
- DAO
- 列表视图
- 适配器
- Transferlogic 数据列表视图 --> 选定的数据列表视图
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/