在 Android 中使用 rawQuery 和 rowid 从 sqlite 数据库中选择一行

Selecting one row from sqlite database using rawQuery and rowid in Android

我创建了一个看起来像这样的外部 SQLite 数据库:

我想在我的 Android 应用程序中做的是使用 ROWID 从一行中加载所有值并将它们放入数组中。例如:

Cursor cursor = db.rawQuery("SELECT * FROM Dairy WHERE ROWID = 1", null);

这将 return 第 1 行中的所有值:51、35、63。但是,这始终 return 只是第一个值,在本例中为 51。此外,cursor.getCount() 总是 returns 1.

这是我的完整代码:

db = getReadableDatabase();

Cursor cursor = db.rawQuery("SELECT * FROM Dairy WHERE ROWID = 1", null);

yData = new int[cursor.getCount()];

if (cursor.moveToFirst()) {
    for (int i = 0; i < cursor.getCount(); i++) {
        yData[i] = cursor.getInt(0);
        cursor.moveToNext();
    }
    cursor.close();
}
db.close();

如果我理解正确,您需要 return 单行中每一列的值。由于您 select 只有单行并且想从每一列中获取值,因此您只需要获取每一列的索引。然后遍历它们。这是如何完成的代码。

Cursor cursor = db.rawQuery("SELECT * FROM Dairy WHERE ROWID = 1 Limit 1", null);

if (cursor.moveToFirst()) {
    String[] columnNames = cursor.getColumnNames();
    yData = new int[columnNames.length];

    for (int i = 0; i < columnNames.length; i++) {
        // Assume every column is int
        yData[i] = cursor.getInt(cursor.getColumnIndex(columnNames[i]));
    }  
}

cursor.close();
db.close();

getInt (int columnIndex) 方法 return 请求的列而不是整行。而 moveToFirst ()moveToNext () 将光标移动到第一行或下一行,如果光标不为空,或者如果调用 moveToNext () 时光标没有超过最后一行。否则两者都会 return false.

因此,成功时,游标包含一个完整的行,您可以通过直接提供基于 0 的索引或通过 getColumnIndex(String columnName) 提供列名来获取列索引来访问元素该列然后访问该列。

您可以参考 android 开发人员指南,Cursor

你总是得到相同的值:

if (cursor.moveToFirst()) {
    for (int i = 0; i < cursor.getCount(); i++) {
        //cursor.getInt(0); You probably want to get 0, 1 & 2
        yData[i] = cursor.getInt(0);
        cursor.moveToNext();
    }

    cursor.close();
}