Проблема с SQL Query для Android, где пункт - PullRequest
6 голосов
/ 03 июля 2011

У меня есть следующий код, который создает мою таблицу. Я вставляю в него данные, которые выглядят так:

_id     date     recordName     total
--------------------------------------
7      2011     TestMaxRecord     5

Java-код:

public static final String KEY_ROWID = "_id";   
public static final String KEY_DATE = "date";
public static final String KEY_TOTAL = "total";
public static final String KEY_RECORD_NAME = "recordName";

private static final String DATABASE_CREATE_RECORDS = "create table " + DATABASE_TABLE_RECORDS + " (" 
+ KEY_ROWID + " integer primary key autoincrement, " 
+ KEY_DATE + " text not null, "
+ KEY_RECORD_NAME + " text not null, "
+ KEY_TOTAL + " text not null);";

public Cursor getRecord(String name) throws SQLException {
  return mDb.query(true, DATABASE_TABLE_RECORDS, new String[] {KEY_ROWID, KEY_DATE, KEY_RECORD_NAME, KEY_TOTAL}, KEY_RECORD_NAME + " = " + name, null, null, null, null, null);
}

Он генерирует исключение каждый раз, когда name = "TestMaxRecord" (несмотря на наличие данных) со следующей ошибкой

android.database.sqlite.SQLiteException: такого столбца нет: TestMaxRecord: при компиляции: SELECT DISTINCT _id, date, recordName, всего FROM записей WHERE recordName = TestMaxRecord

Мне кажется, что он ищет заголовок столбца TestMaxRecord. Я новичок в Android, но скопировал эту часть почти точно из примера (хотя он использовал int). Есть ли разница между использованием int и Strings в вашем запросе?

1 Ответ

11 голосов
/ 03 июля 2011

Вам нужно поместить одинарные кавычки вокруг значения, иначе оно будет восприниматься как столбец.

KEY_RECORD_NAME + " = '" + name + "'"

Примечание: это решение открыто для Sql Injection, вы должны использовать заполнители параметров и передавать значения через аргумент selectionArgs:

public Cursor getRecord(String name) throws SQLException {
  return mDb.query(true, 
    DATABASE_TABLE_RECORDS, 
    new String[] {KEY_ROWID, KEY_DATE, KEY_RECORD_NAME, KEY_TOTAL}, 
    KEY_RECORD_NAME + " = ?",
    new String[] {name},
    null, null, null, null);
}

Или посмотрите на SQLiteQueryBuilder

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...