2013-03-19 2 views
0

Привет Я вставляю общие комментарии в свою базу данных динамически. и мой запрос выглядит следующим образом:Вставка текста в базу данных, как позаботиться о '

String sql = "insert into table (comment) values('"+ dynamic_comment + "');"; 

Я получаю сообщение об ошибке, когда использование вставить что-то вроде этого:

Я делаю большой

becuase в то время мой запрос становится:

insert into table (comment) values('I'm doing great'); 

«Я делаю большой»

Error: Caused by: android.database.sqlite.SQLiteException: near "t": 
syntax error (code 1): , while compiling: 
insert into timeline(comment) values('Can't belive it really works'); 

Может кто-нибудь сказать мне, как решить эту проблему, и как многие другие проблемы, которые я могу столкнуться, как это при работе с базой данных.

спасибо

+2

Вы не первый человек, чтобы столкнуться с этой проблемой. Вы пытались найти ответ? – eggyal

+3

Используйте [** параметры **] (http://www.devart.com/dotconnect/sqlite/docs/Parameters.html). –

+0

http://stackoverflow.com/questions/433392/how-do-i-use-prepared-statements-in-sqlite-in-android – pablochan

ответ

2

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

От here:

SQLiteDatabase db = dbHelper.getWritableDatabase(); 
SQLiteStatement stmt = db.compileStatement("insert into table (comment) values(?)"); 
stmt.bindString(1, dynamic_comment); 
stmt.execute(); 
+0

почему вы положили 1 здесь: stmt.bindString (1, dynamic_comment); – 2013-03-19 09:59:14

+0

Взгляните на [javadoc] (http://developer.android.com/reference/android/database/sqlite/SQLiteProgram.html#bindString (int,% 20java.lang.String)) - Я связываю первый параметр ('' ') на значение' dynamic_comment'. –

+0

Большое спасибо. – 2013-03-20 09:30:31

1

Перед вставкой вам нужно избежать вашей строковой переменной.

String sql = "insert into table (comment) values('"+ DatabaseUtils.sqlEscapeString(dynamic_comment) + "');"; 

Описанный выше метод склонен к SQL инъекции атак. Чтобы быть на более безопасной стороне, узнайте больше об использовании parametric statements.

Образец для того же самого запроса, как у вас будет:

SQLiteDatabase db = dbHelper.getWritableDatabase(); 
SQLiteStatement stmt = db.compileStatement("INSERT INTO `table` (`comment`) values(?)"); 
stmt.bindString(1, dynamic_comment); 
stmt.execute(); 
+2

.... или, еще лучше, параметризовать подготовленный оператор. – eggyal

+2

Всегда используйте параметризованные утверждения, иными словами, вы просто запрашиваете атаки SQL-инъекций. – NickJ

+0

Не делайте этого. Подготовленные утверждения - правильный ответ. – pablochan

Смежные вопросы