Подтвердить что ты не робот

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

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

Спасибо

4b9b3361

Ответ 1

Вы можете использовать служебную программу 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-запрос без подготовки.

Ответ 2

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

Ответ 3

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

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 по этой логике и не требует дополнительного экранирования.