我正在尝试使用我的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
这是什么意思?
答案 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被当作一个列而不是一个值。