может кто-нибудь сказать Как избежать или заменить не поддерживаемый символ, как одинарные кавычки в sqlite в android, может кто-нибудь дать пример
Спасибо
может кто-нибудь сказать Как избежать или заменить не поддерживаемый символ, как одинарные кавычки в sqlite в android, может кто-нибудь дать пример
Спасибо
Вы можете использовать служебную программу commons-lang, или вы можете использовать regexp для ее обработки.
Если вы создаете динамический SQL, то я бы предложил использовать подготовленный оператор, который бы устранил необходимость экранирования одиночных кавычек.
Использование только динамического SQL, построенного с использованием конкатенации строк:
String value = "one self";
StringBuilder query= new StringBuilder();
query.append("insert into tname(foo) values (").append(value).append(")");
... execute call with query.toString() ...
Измените это на
String value = "one 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 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-инъекций".
Подробнее см. http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html.
ИЗМЕНИТЬ Я сделал немного больше копания, вы можете использовать DatabaseUtils.sqlEscapeString(String), чтобы избежать содержимого строки, чтобы она была действительной для полного SQL-запрос без подготовки.
Разве это не делается с помощью простого \? Таким образом, ваша одиночная кавычка была бы.
На самом деле самым простым способом является замена одинарных кавычек (') двумя одинарными кавычками (' '). Тогда ваш запрос станет следующим:
insert into tname(foo) values ('one' self');
Объяснение: SQLite выступает за использование одинарных кавычек (') вместо двойных кавычек ( ") в качестве разделителей строк, утверждая, что это то, что требует стандарт SQL (я не смог это подтвердить) SQLite также отличается от всех других SQL-баз данных, которые я знаю, тем, что он использует" вместо", снова, требуя стандартов SQL. (Опять же, я не смог подтвердить это утверждение).
Лично я склонен не соглашаться с этим утверждением, поскольку каждая другая база данных SQL, которую я знаю, использует способ сбрасывания символов C, обратный слэш. Даже если бы это было написано, чтобы использовать "где-то в стандарте ISO SQL", я считаю, что лучше всего пересмотреть этот стандарт, чтобы использовать способ C, потому что на практике он уже является стандартом.
Обратите внимание:
insert into tname(foo) values ('ones "self"');
- это действительная инструкция sql по этой логике и не требует дополнительного экранирования.