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

SQL インジェクション攻撃を防ぐために、selectionArgsパラメータの使用を検討する必要があります。rawQuery()

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

また、必要な列は 1 つだけなので、 ですべてを選択してリソースを浪費するのではなく*、1 つの列だけを選択する必要があります。

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 に答える