android cursor.moveToNext()?

时间:2012-04-10 00:38:23

标签: android sql database cursor

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

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

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

5 个答案:

答案 0 :(得分:32)

简单的用法是:

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

当你需要从已经到达某个位置后开始迭代时,使用moveToFirst。

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

getCount很昂贵 - 它会迭代许多记录来计算它们。它不返回存储的变量。第二次通话时可能会有一些缓存,但第一次通话在计算之前不知道答案。

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

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

答案 1 :(得分: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();
    }

答案 2 :(得分:2)

我正在对我的循环进行编码,如下所示:

    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);
    }

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

答案 3 :(得分:1)

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

int index = c.getColumnIndex("Column_Name");
string = c.getString(index);

答案 4 :(得分:0)

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();