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. У кого-нибудь есть рекомендации по решению проблем?
Ответы
Ответ 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'