1. ホーム
  2. android

[解決済み] 選択しようとしたときに SQLite Exception no such column

2022-02-05 08:41:35

質問

以下のようなDBヘルパークラスがあります。

public int studentExists(String studid) {
    Cursor dataCount = mDb.rawQuery("select count(*) from usertable where " + KEY_STUDID + "=" + studid, null);
    dataCount.moveToFirst();
    int count = dataCount.getInt(0);
    dataCount.close();
    return count;
}

私のアプリでは、学生IDが以前に入力されたものかどうかを確認するために、これを使用しています。

学生IDがint型(346742)の場合は正常に動作しますが、英数字(PB3874)を追加しようとすると、アプリが強制終了します。

エラーです。

06-13 18:22:20.554: ERROR/AndroidRuntime(8088): android.database.sqlite.SQLiteException: no such column: pb3874.このようなカラムはありません。コンパイル中:select count(*) from usertable where studid=pb3874

データ型の問題ではないと思います(私はテキスト型を使っているので)。

    private static final String DATABASE_CREATE =
    "create table usertable (_id integer primary key autoincrement, "
    + "studid text not null);";

しかし、なぜこのようなエラーが発生するのかがわかりません。 no such column: pb3874 studidカラムから単純にその値を選択しようとしているためです。 また、なぜこれは任意のint値に対して完全に動作するのでしょうか? どなたか、問題解決のためのアドバイスをお願いします。

解決方法は?

ここで起こっていることは、SQLite が 'pb3874' を文字列/テキストリテラルではなく、実際にはカラム名であるとみなしていることです。

テキストリテラルであることを指定するには、テキスト値を適切なシングルクォートで囲む必要があります。

SQLインジェクション攻撃を防ぐために、ユーザーから入力を受けるときは常にパラメータ化されたクエリを使用します。

("select count(*) from usertable where " + KEY_STUDID + "=?", studid);

パラメタライズなし(ユーザー入力を取る場合は非常にお勧めしません)。

("select count(*) from usertable where " + KEY_STUDID + "='" + studid + "'", null);  

数値が出なかった理由。SQLiteが数値リテラルを変換してくれたからです。