如何使用主键 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();
我有一个 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();