2009-08-18 2 views
41

Я хочу, чтобы выполнить запрос, как следующее:Android кавычки в строку запроса SQL

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 + "\"" ; 

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

+0

miannelle, проверить эти связанные вопросы: http://stackoverflow.com/questions/29699/how-do-i-deal-with-quotes-in-sql http://stackoverflow.com/questi ons/387198/escape-double-quotes-in-sql-2005-2008 –

+3

miannelle: Вы должны взглянуть на некоторые из своих вопросов как «ответили» – Kurru

ответ

125

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

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

Это не только решает проблему котировки, но и уменьшает SQL Injection.

+5

Хотелось бы, чтобы я мог продвигать это более одного раза! – jrockway

+1

Это также намного быстрее, потому что Sqlite не нужно разбирать каждый SQL-оператор. – tuinstoel

+20

Действительно, вы должны использовать аргументы запроса. Однако вы также можете использовать DatabaseUtils для удаления строк, если это необходимо. Например, DatabaseUtils.sqlEscapeString(). Это не лучший способ, но он доступен. Может быть полезно, если вы пытаетесь передать исходный SQL-запрос на что-то внешнее. – lilbyrdie

14

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

2

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

+0

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

1

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

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

круто .. !!

+1

, это глупо, вы заменяете «на», что по-прежнему вызывает проблемы. – stealthcopter

+0

Возможно, глупо, но отлично работает для меня. Спасибо –

+0

@stealthcopter. Это не глупо, стандартный способ SQL избегать одиночной цитаты в строковом литерале состоит в том, чтобы удвоить его, поэтому '' '' ''является строковым литералом SQL, который содержит одну одинарную цитату. Ручное экранирование строк для SQL может быть не лучшей идеей, но результат в этом случае правильный. –

1

Я предпочитаю, чтобы избежать Одиночные и двойные кавычки в каждом заявлении вставки с Sqlite так:

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

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

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

как

p_query = "select * from mytable where name_field = '" + android.database.DatabaseUtils.sqlEscapeString(uvalue)+ "'" ; 
+0

Удивительное и ясное решение –

+0

, но вам нужно удалить кавычки, потому что они добавляются по умолчанию –

Смежные вопросы