Как избежать неподдерживаемого символа в SQLite на Android? - PullRequest
17 голосов
/ 25 марта 2011

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

Спасибо

Ответы [ 3 ]

41 голосов
/ 25 марта 2011

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

Если вы создаете динамический 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-инъекций».

Подробнее см. http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html.

EDIT Я немного больше покопался, вы можете использовать DatabaseUtils.sqlEscapeString (String) для экранирования содержимого строки, чтобы оно действовало для полного оператора SQL без подготовок.

0 голосов
/ 23 июля 2012

На самом деле, самый простой способ - заменить одинарные кавычки (') на две одинарные кавычки (' '). Ваш запрос станет:

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

0 голосов
/ 25 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...