10

我正在尝试将表中的所有列查询到一个长文本视图和/或字符串中。我知道这可能不是正确的做事方式,但我必须这样做。如果我错了,请纠正我,我的印象是下一步移动将获得该行的下一列:

Cursor c = db.get();
if(c.moveToFirst){
  do{
    string = c.getString(0);
  }while(c.moveToNext);
}

我认为这将获得第一列并显示其所有内容,而不是获得第一列和第一行。我究竟做错了什么?在不使用 ListView 的情况下,有没有更好或更真实的方法来获取这些信息?

4

5 回答 5

36

简单的用法是:

Cursor cursor = db.query(...);
while (cursor.moveToNext()) {
    ...
}

当您需要在到达某个位置后从 start 开始迭代时,使用 moveToFirst。

除非需要,否则避免使用 cursor.getCount()。并且永远不要在 getCount() 上使用循环。

getCount 很昂贵——它遍历许多记录来计算它们。它不返回存储的变量。第二次调用可能会有一些缓存,但第一次调用在计算之前不知道答案。

如果您的查询匹配 1000 行,则游标实际上只有第一行。每个 moveToNext 搜索并找到下一个匹配项。getCount 必须找到所有 1000。如果只需要 10,为什么要遍历所有?为什么要迭代两次?

此外,如果您的查询不使用索引,getCount 可能会更慢 - getCount 可能会超过 10000 条记录,即使查询仅匹配 100 条记录。为什么要循环 20000 而不是 10000?

于 2013-04-24T07:57:08.573 回答
12

为清楚起见,一个完整的示例如下所示,我相信这很有趣。正如代码注释所指出的,我们本质上是遍历数据库行和列,以根据数据库形成一个数据表。

    Cursor cursor = getActivity().getContentResolver().query(uri, projection, null, null,
            null);

    //if the cursor isnt null we will essentially iterate over rows and then columns
    //to form a table of data as per database.
    if (cursor != null) {

        //more to the first row
        cursor.moveToFirst();

        //iterate over rows
        for (int i = 0; i < cursor.getCount(); i++) {

            //iterate over the columns
            for(int j = 0; j < cursor.getColumnNames().length; j++){ 

                //append the column value to the string builder and delimit by a pipe symbol
                stringBuilder.append(cursor.getString(j) + "|"); 
            }
            //add a new line carriage return
            stringBuilder.append("\n");

            //move to the next row
            cursor.moveToNext();
        }
        //close the cursor
        cursor.close();
    }
于 2012-10-04T13:29:16.687 回答
2

我正在像这样在 cusror 上编写循环:

    cursor.moveToFirst();
    while(!cursor.isAfterLast()) {

            cursor.getString(cursor.getColumnIndex("column_name"));

        cursor.moveToNext();
    }

这总是有效的。这将检索所有行的“column_name”列的值。您的错误是您循环遍历行而不是列。要遍历列:

cursor.moveToFirst();    
    for(int i = 0; i < cursor.getColumnNames().length; i++){
        cursor.getString(i);
    }

这将遍历第一行的列并检索每个列的值。

于 2012-04-10T01:52:56.123 回答
1

cursor.moveToFirst()将光标移动到第一行。如果您知道您有 6 列,并且想要一个包含所有列的字符串,请尝试以下操作。

c.moveToFirst();
StringBuilder stringBuilder = new StringBuilder();
for(int i = 0; i < 6; i++){
   stringBuilder.append(c.getString(i));
}

// to return the string, you would do stringBuilder.toString();
于 2012-04-10T01:22:46.497 回答
1

moveToNext 将光标移动到下一行。如果有第一列,c.getString(0) 将始终为您提供第一列。我认为你应该在你的循环中做类似的事情

int index = c.getColumnIndex("Column_Name");
string = c.getString(index);
于 2012-04-10T01:17:43.897 回答