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; } 

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

Это отлично работает, когда id студента – ints (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. У кого-нибудь есть рекомендации по решению проблем?

Solutions Collecting From Web of "SQLite Exception нет такого столбца при попытке выбрать"

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

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

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

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

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

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

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

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

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

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

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

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

 dataCount.getInt(0); 

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