Android кавычки в строке запроса SQL

41

Я хочу выполнить следующий запрос:

uvalue = EditText( some user value );
p_query = "select * from mytable where name_field = '" +  uvalue + "'" ;
mDb.rawQuery( p_query, null );

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

p_query = "select * from mytable where name_field = \"" +  uvalue + "\"" ;

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

Теги:

6 ответов

119

Вы должны использовать параметр rawQuery selectionArgs:

p_query = "select * from mytable where name_field = ?";
mDb.rawQuery(p_query, new String[] { uvalue });

Это не только разрешает вашу проблему с кавычками, но также смягчает SQL Injection.

  • 6
    Я хотел бы изменить это не раз!
  • 1
    Это также намного быстрее, потому что Sqlite не должен анализировать каждый SQL-оператор.
Показать ещё 4 комментария
14

DatabaseUtils.sqlEscapeString работает правильно для меня. Строка заключена в одинарные кавычки, а одинарные кавычки внутри строки становятся двойными кавычками. Пробовал использовать selectionArgs в getContentResolver(). Query(), но он вообще не работал.

  • 0
    DatabaseUtils.sqlEscapeString заменяет один или два специальных символа, если необходимо заменить все специальные символы. Разве нет способа заменить указанные или все специальные символы?
1

Вы должны изменить

p_query = "select * from mytable where name_field = '" +  uvalue + "'" ;

like

p_query = "select * from mytable where name_field = '" + android.database.DatabaseUtils.sqlEscapeString(uvalue)+ "'" ;
  • 1
    Потрясающее и ясное решение
  • 2
    но вам нужно удалить кавычки, потому что они добавляются по умолчанию
1

Я предпочитаю избегать одиночных кавычек и двойных кавычек в каждой инструкции вставки с помощью Sqlite следующим образом:

 String sqlite_stament = sqlite_stament.replace("'", "''").replace("\"", "\"\"");
1

Вы пытались заменить одну кавычку на две одинарные кавычки? Это работает для ввода данных в базу данных.

  • 0
    Я бы предпочел использовать верхний ответ, но в моем случае это было невозможно сделать дизайн приложения. Это тоже работает
0

У меня такая же проблема, но теперь она решается просто написанием кода, как в вашем случае вы хотите вставить значение uvalue. Затем напишите как

uvalue= EditText( some user value );
uvalue = uvalue.replaceAll("'", "''");
p_query = "select * from mytable where name_field = '" +  uvalue + "'" ;
mDb.rawQuery( p_query, null );

круто..!!

  • 2
    это глупо, вы заменяете «на», что все равно вызывает проблемы.
  • 0
    Возможно глупо, но у меня отлично работает. Спасибо
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню