2010-04-11 5 views
2

Я знаю, что есть, вероятно, простая вещь, которую мне не хватает, но я бил головой о стену в течение последних двух-двух часов. У меня есть база данных для приложения Android, над которым я сейчас работаю (Android v1.6), и я просто хочу вставить одну запись в таблицу базы данных. Мой код выглядит следующим образом:Android вставить в базу данных sqlite

//Save information to my table 
sql = "INSERT INTO table1 (field1, field2, field3) " + 
     "VALUES (" + field_one + ", " + field_two + ")"; 
Log.v("Test Saving", sql); 
myDataBase.rawQuery(sql, null); 

переменная MyDatabase является SQLiteDatabase объект, который может выбрать штраф данных из другой таблицы в схеме. Сохранение работает нормально (никаких ошибок в LogCat), но когда я копирую базу данных с устройства и открываю его в браузере sqlite, новая запись там отсутствует. Я также попытался вручную запустить запрос в браузере sqlite, и это работает нормально. Схема таблицы для таблицы 1 - это _id, field1, field2, field3.

Любая помощь была бы принята с благодарностью. Благодаря!

+5

Я настоятельно рекомендую использовать параметры («?»), А не конкатенировать ваши строки в запросе. Вы будете подвергать риску неправильные запросы или инъекции. –

+0

@JimBlackler Можете ли вы привести небольшой пример использования '?' Для вышеуказанного запроса. Я googled, но не мог найти его. – VenomVendor

ответ

0

Я изменил свой код, чтобы использовать myDataBase.insert() вместо rawQuery(), и он работает. Я не уверен, почему фактический sql-запрос не работал, хотя, если кто-то может пролить свет на это, я все равно буду признателен.

+3

Если то, что вы отправили, является точным запросом, это потому, что вы указываете 3 поля, но только передаете 2 значения. – tadamson

+26

'rawQuery()' для запросов. Оператор 'INSERT' не является запросом. Если вы хотите выполнить необработанный SQL, который не возвращает результирующий набор, используйте 'execSQL()'. – CommonsWare

+0

Ах, execSql() - это то, что мне тогда нужно. И да, я передавал 3 значения в моем коде, но он потерялся в очистке кода, когда я вложил его сюда. Благодаря! @CommonsWare, если вы опубликуете это как ответ, я дам вам кредит на его решение. – Blather

10

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

sql = "INSERT INTO table1 (field1, field2) " + 
    "VALUES (" + field_one + ", " + field_two + ")"; 

хотя ваша схема содержит три поля. Кстати, вы можете увидеть журнал, чтобы увидеть фактическую отчетность об ошибках из sqlite.

+0

Я очистил код и случайно удалил третье поле в разделе значений. Хороший улов. – Blather

5

Поскольку это строковые значения вы забыли «'» добавить ... этот запрос будет, конечно, работать, я тестировал

sql = "INSERT INTO table1 (field1, field2) " + 
"VALUES ('" + field_one + "', '" + field_two + "')"; 
+1

+1 за помощь Мэдди Дж – ekjyot

6

правильный ответ дается CommonsWare в комментариях. Вы должны использовать execSql() вместо rawQuery(). И это работает как шарм.

Я думал, что это будет полезно для других, не нужно копать комментарии, чтобы найти правильный ответ.