我想从SQLite表中获取数据,我知道该表总是只有一条记录。我正试着这样做:
public User_Token getUser_TokenDB() {
String sql = "SELECT * FROM " + TABLE_NAME_USER_TOKEN +" WHERE ID = " + 1;
Cursor cursor = this.database.rawQuery(sql, null);
User_Token auxUserToken = new User_Token(
cursor.getLong(0),
cursor.getString(1),
cursor.getString(2),
cursor.getString(3));
return auxUserToken;
}
但我总是得到:
'java.lang.RuntimeException: Unable to start activity ComponentInfo{com.support.android.iplfit/com.support.android.iplfit.Activities.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 0'.
我可以访问此信息的唯一方法是返回一个Tokens数组并执行.get(0),但我觉得这不是正确的方法,因为返回一个只有一个对象的数组是没有意义的。
答案 0 :(得分:1)
游标索引超出范围。您需要使用Cursor#moveToFirst()
将光标移动到0
索引,如果光标中有项目,则返回true
。
这样的事情:
if (cursor.moveToFirst()) {
// Cursor has items and is ready for extraction
} else {
// Cursor has no items.
}
答案 1 :(得分:1)
您需要在第一行移动cursor
,然后才能从中获取数据。在访问moveToNext
cursor
方法
while(cursor.MoveToNext()) {
User_Token auxUserToken = new User_Token(
cursor.getLong(0),
cursor.getString(1),
cursor.getString(2),
cursor.getString(3));
}
答案 2 :(得分:1)
你移动到光标内的位置,因此位置在任何行之前,即-1。
您需要移动到一行,在您的情况下,您需要第一行(不是有任何 (即消息显示 大小为0 ))并且只有在可以进行移动时才需要提取数据。否则你将无法处理任何数据。
光标move????
方法(moveToFirst
,moveToLast
,moveToNext
,moveToPrevious
,moveToPosition
)如果移动可以返回true做了,否则是假的。
所以你的代码是: -
Cursor cursor = this.database.rawQuery(sql, null);
if (cursor.moveToFirst) {
User_Token auxUserToken = new User_Token(
cursor.getLong(0),
cursor.getString(1),
cursor.getString(2),
cursor.getString(3));
} else {
return null; //???? handle no data how you want perhaps null.
}
return auxUserToken;
作为注释,通常使用列偏移是不可取的,而更常见的方法是使用getColumnIndex(column_name)
根据列名获取偏移量。因此(假设列名称为 id
)将cursor.getLong(0)
替换为cursor.getLong(cursor.getColumnIndex("id")