【问题标题】:How to get cursor count without LIMIT?如何在没有限制的情况下获得游标计数?
【发布时间】: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,然后让CursorAdapterListView 处理剩下的事情。
  • @krislarson 所以我应该让我的光标拉整个数据库并使用 cursoradapter 来限制它?我不确定你所说的分页逻辑是什么意思,它在哪里构建到 listview,它可以处理开箱即用的自动滚动加载吗?
  • 分页是指您在onScroll 方法中添加的逻辑——向下滚动到某个点,然后获取更多要显示的项目。这 10 个项目将代表一个“页面”。现在,当您运行查询并生成Cursor 时,整个查询数据不会进入内存。如果需要,您可以查找 CursorWindow 之类的类并阅读源代码以了解游标是如何工作的。不过,如果您在 ListView 中查询所需的所有内容并将生成的 Cursor 放入 CursorAdapter,您将能够滚动整个列表而不会出现明显的性能问题。

标签: android android-sqlite android-cursor


【解决方案1】:

使用以下方法获取表中的行数。

public synchronized long getRowCount(String TABLE_NAME) {
    SQLiteDatabase db = this.getReadableDatabase();
    return DatabaseUtils.queryNumEntries(db, TABLE_NAME);
}

使用where 子句获取表格行数

public synchronized long getRowCount(String TABLE_NAME) {
    SQLiteDatabase db = this.getReadableDatabase();
    return DatabaseUtils.queryNumEntries(db, TABLE_NAME, "NAME like ?", new String[]{"%D%"})
}

【讨论】:

  • 这将返回表的行数。我在没有限制的游标的行数之后。
  • 它将无限返回行数。
  • 你误会了。我不想要数据库中的项目数,我知道如何计算。我想要光标中的项目数(并不总是整个数据库)。我的光标可能是所有以 D 开头的名字。
  • 那么你可以使用DatabaseUtils.queryNumEntries(db, TABLE_NAME, "NAME like ?", new String[]{"%D%"});
猜你喜欢
  • 1970-01-01
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-09
  • 2012-08-27
  • 2013-02-28
  • 2019-10-06
相关资源
最近更新 更多