【发布时间】:2016-06-11 04:14:29
【问题描述】:
我从一个游标中设置了一个ListView,该游标抓取数据库中的前 10 行 (LIMIT)。
cursor = db.query("MYTABLE",
new String[]{"_id", "NUMBER", "NAME"}, null, null, null, null, null, "10");
列表设置为“无限滚动”。它通过在滚动完成后比较列表中的项目数和数据库中的项目数来做到这一点(onScroll from OnScrollListener)
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(firstVisibleItem+visibleItemCount == totalItemCount && totalItemCount!=0)
{
ListView listView = (ListView) findViewById(R.id.my_list);
long numberOfItemsInDB = DatabaseUtils.queryNumEntries(db, "MYTABLE");
long numberOfItemsInList = listView.getAdapter().getCount();
long difference = numberOfItemsInDB - numberOfItemsInList;
if (difference > 0) {
... //do stuff here
}
这行得通。但有时列表可能会填充来自自定义光标的项目(例如来自搜索过滤),因此我需要该光标的项目计数。我可以通过使用.getCount() 来获得一致的计数,但如果我已经使用了 LIMIT,那么它只会返回我拥有的 LIMIT,即 10。
如何在忽略限制的情况下获取光标中的项目数?
【问题讨论】:
-
您的代码正在使用通常用于从远程服务器获取数据的分页方法。当您从本地数据库获取数据时,您不需要该分页逻辑。
Cursor类——特别是SQLiteCursor类——在内部处理所有的分页。通过CursorAdapter和回收ListView,您拥有所需的一切。输入您想要的整个数据集的查询,获取Cursor,然后让CursorAdapter和ListView处理剩下的事情。 -
@krislarson 所以我应该让我的光标拉整个数据库并使用 cursoradapter 来限制它?我不确定你所说的分页逻辑是什么意思,它在哪里构建到 listview,它可以处理开箱即用的自动滚动加载吗?
-
分页是指您在
onScroll方法中添加的逻辑——向下滚动到某个点,然后获取更多要显示的项目。这 10 个项目将代表一个“页面”。现在,当您运行查询并生成Cursor时,整个查询数据不会进入内存。如果需要,您可以查找CursorWindow之类的类并阅读源代码以了解游标是如何工作的。不过,如果您在ListView中查询所需的所有内容并将生成的Cursor放入CursorAdapter,您将能够滚动整个列表而不会出现明显的性能问题。
标签: android android-sqlite android-cursor