Подтвердить что ты не робот

SQLite Exception нет такого столбца при попытке выбрать

У меня есть следующий вспомогательный класс 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;
}

Я использую это в своем приложении, чтобы узнать, был ли ранее введен идентификатор студента.

Это отлично работает, когда идентификатор студента - int (346742), но всякий раз, когда я пытаюсь добавить буквенно-цифровой идентификатор (PB3874), он закрывает приложение.

Ошибка:

06-13 18: 22: 20.554: ERROR/AndroidRuntime (8088): android.database.sqlite.SQLiteException: нет такого столбца: pb3874: при компиляции: выберите count (*) из usertable где 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. У кого-нибудь есть рекомендации по решению проблем?

4b9b3361

Ответ 1

Что здесь происходит, так это то, что SQLite считает, что "pb3874" на самом деле является именем столбца, а не литералом строки/текста.

Чтобы указать, что это текстовый литерал, вы хотите, чтобы ваше текстовое значение было обернуто в соответствующие одинарные кавычки:

Чтобы предотвратить атаки SQL-инъекций, всякий раз, когда вы вводите данные от пользователя, используйте параметризованный запрос:

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

Без параметризации (очень неудобно при вводе пользователя):

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

Причина, по которой ваши числовые значения не дали этого: SQLite преобразовал эти числовые литералы для вас.

Ответ 2

Вам нужно указать "pb3874" (одинарные кавычки), если вы включили его в строку SQL.

Ответ 3

Я думаю, что вы получили ответ о том, что неправильно с Antlersoft или p.campbell, чтобы правильно отформатировать запрос, я бы предположил, что вы делаете это следующим образом:

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

Это должно (1) решить вашу проблему и (2) защитить вас от SQL-инъекций

Кроме того, я не уверен, что

dataCount.getInt(0);

- лучшее, что нужно сделать... вы должны, вероятно, использовать getColumnIndex, чтобы убедиться, что вы получаете правильные данные...

Ответ 4

для STRING вы должны поместить это между "'(' sasas ')

select * from bio where email = 'sasas'