Исключение SQLite нет такого столбца при попытке выбрать - PullRequest
26 голосов
/ 14 июня 2011

У меня есть следующий класс помощника БД:

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

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

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

Ошибка:

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

Ответы [ 4 ]

65 голосов
/ 14 июня 2011

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

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

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

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

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

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

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

6 голосов
/ 14 июня 2011

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

2 голосов
/ 14 июня 2011

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

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

То, что должно (1) решитьВаша проблема и (2) защита от SQL-инъекций

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

dataCount.getInt(0);

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

0 голосов
/ 25 октября 2017

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

select * from bio where email = 'sasas'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...