从sql数据库中选择一个单元格

时间:2012-08-27 17:02:46

标签: android sql sqlite

我正在尝试使用我的Android-App进行简单的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
这是什么意思?

3 个答案:

答案 0 :(得分:2)

您应该考虑使用selectionArgs的{​​{1}}参数来阻止SQL Injection Attacks

rawQuery()

此外,您只需要一个列,而不是通过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() });

答案 1 :(得分:1)

Chan ge是您计划的第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()} );

答案 2 :(得分: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被当作一个列而不是一个值。