如何使用主键 android 获取行游标

How to get row cursor with primary key android

我有一个 table 具有以下内容

@Override
public void onCreate(SQLiteDatabase database) {
    database.execSQL( "CREATE TABLE " + TABLE_NAME + " (" + "ID" + " INTEGER PRIMARY KEY," +
        COLUMN_TOPIC + " TEXT," + COLUMN_LOCATION + " TEXT)");
}

我正在尝试获取给定 rowid 的所有数据

public void getRowCursor(int position){
    SQLiteDatabase database = getWritableDatabase();
    
    Cursor cursor = database.rawQuery("SELECT * FROM " + TABLE_NAME + " WHERE " +
                "ID" + "=" + String.valueOf(position), null);
    cursor.moveToFirst();
    cursor.close
    //or
    
    Cursor cursor = database.query(TABLE_NAME, null, "ID", new String[]{
        String.valueOf(position)},  null, null, null, null );
    cursor.moveToFirst();
    cursor.close
    database.close
}

我收到一个错误

java.lang.IllegalArgumentException: Cannot bind argument at index 1 because the index is out of range.  The statement has 0 parameters.

我确实填充了 table。我如何return基于输入位置的游标。

How do I return a cursor based on the position of entry

首先,您的方法 getRowCursor() 应该 return 一个 Cursor.
另外,你不应该关闭 returned 游标,因为我假设你想以某种方式使用它的结果。

您使用方法 rawQuery() 的代码应该像这样工作:

public Cursor getRowCursor(int position) {
    SQLiteDatabase database = getWritableDatabase();
    String sql = "SELECT * FROM " + TABLE_NAME + " WHERE ID = " + String.valueOf(position);
    Cursor cursor = database.rawQuery(sql, null);
    // cursor.moveToFirst();
    return cursor;
}

但是,将参数传递给查询的安全且推荐的方法是使用 ? 占位符,而不是将它们连接在 sql 语句中并将它们作为数组项传递到 rawQuery():

public Cursor getRowCursor(int position) {
    SQLiteDatabase database = getWritableDatabase();
    String sql = "SELECT * FROM " + TABLE_NAME + " WHERE ID = ?";
    Cursor cursor = database.rawQuery(sql, new String[] {String.valueOf(position)});
    // cursor.moveToFirst();
    return cursor;
}

注意 moveToFirst() 将游标的索引移动到游标的第一行(如果存在)。
我注释掉了这个调用,因为你应该在调用 getRowCursor() 之后使用它,如下所示:

Cursor cursor = getRowCursor(10); // or any other ID
if (cursor.moveToFirst()) {  // the cursor contains at least 1 row
    ....
} else {  // the cursor is empty
    ....
}

当您完成光标操作时:

cursor.close();