0

我正在我的 Android 应用程序中尝试一个简单的 SQL 命令,以获取所选人员的年龄:

public int getAge(){
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM persons WHERE name =? " + MainActivity.selectedPerson.getText().toString(), null);
    int age = cursor.getInt(3);               // column with ages
    cursor.close();
    db.close();
    return age;
}

但是当我运行我的应用程序时,当我调用函数 getAge() 时它会崩溃。我收到以下错误:

SQLiteException: no such column: Max: , while compiling: SELECT * FROM persons WHERE name = Max

我不明白。表中有名称“Max”。我究竟做错了什么?提前致谢。

编辑2:有了这个:

Cursor cursor = db.rawQuery("SELECT name FROM persons WHERE name = '" + MainActivity.selectedPerson.getText().toString() + "'", null);

我得到一个不同的错误:

08-27 19:43:47.573: E/AndroidRuntime(6161): android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1

这是什么意思?

4

3 回答 3

2

您应该考虑使用selectionArgs参数rawQuery()来防止SQL 注入攻击

Cursor cursor = db.rawQuery("SELECT * FROM persons WHERE name = ?", new String[] { MainActivity.selectedPerson.getText().toString() });

此外,您只需要列,而不是通过选择它们来浪费资源*,您应该只选择一列:

Cursor cursor = db.rawQuery("SELECT age FROM persons WHERE name = ?", new String[] { MainActivity.selectedPerson.getText().toString() });

希望有帮助!


总而言之,它应该看起来像:

public int getAge(){
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT age FROM persons WHERE name = ?", new String[] { MainActivity.selectedPerson.getText().toString() });

    int age;
    // Check if you have a valid result and move to the first row to read it
    if(cursor.moveToFirst())
        age = cursor.getInt(0);
    // Prevent a crash if there is no data for this name
    else
        age = 0;

    cursor.close();
    db.close();
    return age;
}
于 2012-08-27T17:10:26.240 回答
1

更改程序的第 3 行:

Cursor cursor = db.rawQuery("SELECT * FROM persons WHERE name =? " + MainActivity.selectedPerson.getText().toString(), null);

对此:

Cursor cursor = db.rawQuery("SELECT * FROM persons WHERE name = ?",  new String[] { MainActivity.selectedPerson.getText().toString()} );
于 2012-08-27T17:21:00.413 回答
0

试试这个:

public int getAge(){
    int age;
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery("SELECT * FROM persons WHERE name = '" + MainActivity.selectedPerson.getText().toString()+"'",null);
    if(cursor.moveToFirst())
    {
    age = cursor.getInt(3);              // column with ages
    }
    cursor.close();
    db.close();
    return age;
}

您错过了 sql 命令中的单引号 (' ')。这就是为什么 MAX 被视为列而不是值的原因。

于 2012-08-27T17:08:08.443 回答