-2

私はSQLite操作でAndroidを学んでいます。次のコードはを引き起こしますが、CursorIndexOutOfBoundsException理由はわかりません。

for (int i = 0; i < cursor.getCount(); i++) {
    cursor.move(i);
    String username = cursor.getString(1);
    Log.i("username", username);
}

ログと例外:

09-13 12:39:18.317: INFO/row count:(3578): 10
09-13 12:39:18.317: INFO/username(3578): aaa_0
09-13 12:39:18.317: INFO/username(3578): aaa_1
09-13 12:39:18.317: INFO/username(3578): aaa_3
09-13 12:39:18.317: INFO/username(3578): aaa_6
09-13 12:39:18.337: ERROR/AndroidRuntime(3578): FATAL EXCEPTION: main
    java.lang.RuntimeException: 
    Unable to start activity ComponentInfo{com.example/com.example.MyActivity}: 
    android.database.CursorIndexOutOfBoundsException: 
    Index 10 requested, with a size of 10

行数が10であることがわかりますが、5行目を取得すると例外がスローされます。

完全なコードは次のとおりです。

import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;

public class MyActivity extends Activity {

    private SQLiteDatabase db;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        createTables();
        insertData();
        queryData();
    }


    private void queryData() {
        Cursor cursor = db.query("users", new String[]{"_id", "username", "password"}, null, null, null, null, null, null);
        if (cursor.moveToFirst()) {
            Log.i("row count: ", "" + cursor.getCount());
            for (int i = 0; i < cursor.getCount(); i++) {
                cursor.move(i);
                String username = cursor.getString(1);
                Log.i("username", username);
            }
        }
    }

    private void insertData() {
        for (int i = 0; i < 10; i++) {
            String sql = "insert into users(username, password) values('aaa_" + i + "','123_" + i + "')";
            db.execSQL(sql);
        }
    }

    private void createTables() {
        this.deleteDatabase("temp.db");
        db = this.openOrCreateDatabase("temp.db", MODE_PRIVATE, null);
        String sql = "create table users(_id integer primary key autoincrement, username text, password text)";
        db.execSQL(sql);
    }

}
4

4 に答える 4

3

これは、次の理由move(int offset)によるものです。

現在の位置からカーソルを前後に相対的に移動します。

于 2012-09-14T07:02:51.340 に答える
2

moveapiは使用しないでください。これは、位置をオフセットで移動するためです。代わりに使用する

Cursor.moveToPosition
于 2012-09-14T07:02:56.877 に答える
2

これを試して...

      cursor.moveToFirst();
    for (int i = 0; i < cursor.getCount(); i++) 
         {           
            String username = cursor.getString(1);
            Log.i("username", username);
            cursor.moveToNext() 
         }

またはあなたのコードに従って...

private void queryData() {
        Cursor cursor = db.query("users", new String[]{"_id", "username", "password"}, null, null, null, null, null, null);
        if (cursor.moveToFirst()) {
            Log.i("row count: ", "" + cursor.getCount());
            for (int i = 0; i < cursor.getCount(); i++) {                
                String username = cursor.getString(1);
                Log.i("username", username);
                cursor.moveToNext() 
            }
        }
    }
于 2012-09-14T07:03:14.640 に答える
2

forループの代わりにdowhileループを使用します。

if (cursor.getCount() != 0) 
{
    if (cursor.moveToFirst()) 
    {
        do 
        {
             // cursor.getString(cursor.getColumnIndex("username")));               
        } while (cursor.moveToNext());
    }
}
于 2012-09-14T07:09:14.523 に答える