Как избежать неподдерживаемого символа в SQLite на Android?

17

может кто-нибудь сказать Как избежать или заменить не поддерживаемый символ, как одинарные кавычки в sqlite в android, может кто-нибудь дать пример

Спасибо

    
задан mohan 25.03.2011 в 12:54
источник

3 ответа

41

Вы можете использовать служебную программу commons-lang, или вы можете использовать regexp для ее обработки.

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

Использование только динамического SQL, построенного с использованием конкатенации строк:

String value = "one's self";
StringBuilder query= new StringBuilder();
query.append("insert into tname(foo) values (").append(value).append(")");
... execute call with query.toString() ...

Измените это на

String value = "one's self";
value= DatabaseUtils.sqlEscapeString(value);
StringBuilder query= new StringBuilder();
query.append("insert into tname(foo) values (").append(value).append(")");
... execute call with query.toString() ...

В идеале используйте подготовленный оператор

String value = "one's self";
StringBuilder query= StringBuilder();
query.append("insert into tname(foo) values (?)");
SQLiteStatement stmt= db.compileStatement(query.toString());
stmt.bindString(1, value);
long rowId= stmt.executeInsert();
// do logic check for > -1 on success

Таким образом, вы не запускаете «атаки SQL-инъекций».

Подробнее см. Ссылка .

ИЗМЕНИТЬ Я сделал немного больше копания, вы можете использовать ответ дан Dave G 25.03.2011 в 13:07

источник
0

Разве это не делается с помощью простого \? Таким образом, ваша одиночная кавычка была бы.

    
ответ дан Bill Mote 25.03.2011 в 13:04
источник
0

На самом деле самым простым способом является замена одинарных кавычек (') двумя одинарными кавычками (' '). Тогда ваш запрос станет следующим:

insert into tname(foo) values ('one''s self');

Объяснение : SQLite выступает за использование одинарных кавычек (') вместо двойных кавычек (") в качестве разделителей строк, утверждая, что это то, что требует стандарт SQL (я не смог это подтвердить) SQLite также отличается от всех других SQL-баз данных, которые я знаю, тем, что он использует «вместо», снова, требуя стандартов SQL. (Опять же, я не смог подтвердить это утверждение).

Лично я склонен не соглашаться с этим утверждением, поскольку каждая другая база данных SQL, которую я знаю, использует способ сбрасывания символов C, обратный слэш. Даже если бы это было написано, чтобы использовать «где-то в стандарте SQL по стандарту ISO», я считаю, что лучше всего пересмотреть этот стандарт, чтобы использовать способ C, потому что на практике он уже является стандартом в любом случае.

Обратите внимание:

insert into tname(foo) values ('ones "self"');

- это действительная инструкция sql по этой логике и не требует дополнительного экранирования.

    
ответ дан Tuncay Göncüoğlu 23.07.2012 в 19:12
источник