Форум программистов, компьютерный форум CyberForum.ru

Правильно составить запрос, содержащий "'" - Android

Восстановить пароль Регистрация
 
 
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
10.11.2014, 21:15     Правильно составить запрос, содержащий "'" #1
Или такая запись/чтение в БД невозможна?
android.database.sqlite.SQLiteException: near "Этуаль":
syntax error (code 1): , while compiling: SELECT _id FROM providers WHERE name='Л'Этуаль'
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.11.2014, 21:15     Правильно составить запрос, содержащий "'"
Посмотрите здесь:

Android EditText и добавление символов в него через собственную "клавиатуру"
Android Как заставить Eclipse "забыть" об ошибках в xml файлах?
Unexpected namespace prefix "map" found for tag fragment Android
Android Осуществить парсинг JSON с помощью готового макета "VKApiMessage"
Notification вывод строки с символами перехода на новую строку "\n" Android
Ошибка "Method call expected" при шифровании RSA Android
Как добавить строку "." в начале в ListView со своим обработчиком Android
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
11.11.2014, 09:37     Правильно составить запрос, содержащий "'" #2
Rube, уважаемый, я недавно сам натолкнулся на такое. Рекомендую ознакомиться с некоторыми статьями на stackoverflow, если хотите, могу дать ссылки. Причём, select - это ещё не самый страшный вариант. Вот когда та же ерунда с insert и update - тут уже репу зачешешь.
Рекомендую использовать, например, метод rawQuery. Второй параметр - список значений. Надо проверить, обязательно ли писать new String[].
http://stackoverflow.com/questions/1...l-query-string
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
11.11.2014, 15:54  [ТС]     Правильно составить запрос, содержащий "'" #3
CoolMind, да я привык, еще с Access, запросы так писать, думаю можно конечно проверять критерии на "'" при записи и при чтении, но хотелось бы без проверки, как например в Regex - предварять наклонной чертой (\.*?+[{|()^$).
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
12.11.2014, 09:31     Правильно составить запрос, содержащий "'" #4
Rube, да, согласен, но SQL использует стиль Паскаля при оформлении строк, а потому апострофы надо удваивать, впрочем, как и кавычки. Можно, конечно, таким способом попробовать. Ещё есть вариант с DatabaseUtils.sqlEscapeString(), но он, как минимум, добавляет апострофы в начале и в конце SQL-выражения.
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
12.11.2014, 10:57  [ТС]     Правильно составить запрос, содержащий "'" #5
Цитата Сообщение от CoolMind Посмотреть сообщение
а потому апострофы надо удваивать
Чтобы удваивать надо их находить, что равноценно моему сообщению ранее. Вобщем буду так и делать, находить их перед записью в БД и выкидывать.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
12.11.2014, 11:19     Правильно составить запрос, содержащий "'" #6
Я ранее столкнулся с апострофами в операциях insert, update, но сегодня решил, на всякий случай, проверить, как себя ведут select'ы. Оказалось, что если пользователь в поиске использует апострофы, то программа падает. Потому что использовал такую форму: T.title LIKE '%" + pattern + "%'".
Использовал вот такой вариант: T.title LIKE " + DatabaseUtils.sqlEscapeString("%" + pattern + "%"). Вроде, работает.

Добавлено через 10 минут
Цитата Сообщение от Rube Посмотреть сообщение
находить их перед записью в БД и выкидывать
Этот вариант не очень хорош. Мне досталась программа как раз с таким способом работы, я отказался от него, потому что так нечестно.
Нужно использовать более правильные способы работы с БД. Вот два примера. http://habrahabr.ru/post/190876/ и http://tech.vg.no/2011/04/04/speedin...rt-operations/
Используя их, я добился как увеличения скорости, так и обхода проблемы с апострофами. Если будет желание, напишу статью.
Вот мой код.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
            helper = new Helper(context);
            SQLiteDatabase db = helper.getWritableDatabase();
            db.beginTransaction();
 
            sqlUpdate = "UPDATE revision SET revision = ? WHERE city_id = ? AND name LIKE ?";
            stmtUpdate = db.compileStatement(sqlUpdate);
 
            stmtUpdate.bindLong(1, rev);
            stmtUpdate.bindLong(2, city_id);
            stmtUpdate.bindString(3, name);
            stmtUpdate.execute();
 
            db.setTransactionSuccessful();
            db.endTransaction();
Со строками там надо быть осторожным. Как всегда, мало где написано. Если строка = null, то надо написать такую процедуру:
Java
1
2
3
4
5
6
    private void bindString(SQLiteStatement stmt, int index, String value) {
        if (value == null)
            stmt.bindNull(index);
        else
            stmt.bindString(index, value);
    }
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
12.11.2014, 15:49  [ТС]     Правильно составить запрос, содержащий "'" #7
Вот что выяснил, запрос хорошо отрабатывает если помещать критерии в кавычки, WHERE name="Л'ЭтуальЭ".
Осталось выяснить как программно вставить эти кавычи.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
12.11.2014, 16:00     Правильно составить запрос, содержащий "'" #8
Rube, вы наткнётесь на грабли с кавычками. Их тоже надо уметь удваивать. Выше приводил пример с DatabaseUtils.sqlEscapeString(), мне кажется, должно работать так:
Java
1
2
String name = "Л'Этуаль";
String sql = "WHERE name = " +  DatabaseUtils.sqlEscapeString(s);
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
12.11.2014, 16:37     Правильно составить запрос, содержащий "'" #9
Цитата Сообщение от Rube Посмотреть сообщение
Осталось выяснить как программно вставить эти кавычи.
Java
1
2
String name = "Л'Этуаль";
String query = "WHERE name = '" + name + "'";
Так не сработает разве?
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
12.11.2014, 16:54     Правильно составить запрос, содержащий "'" #10
Spelcrawler, нет, будет указанная ошибка в первом сообщении ошибка.
Spelcrawler
521 / 491 / 110
Регистрация: 12.03.2014
Сообщений: 1,641
Завершенные тесты: 1
12.11.2014, 16:55     Правильно составить запрос, содержащий "'" #11
Тогда так)
Java
1
String query = "WHERE name = "" + name + """;
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
12.11.2014, 17:00     Правильно составить запрос, содержащий "'" #12
Spelcrawler, это будет строка без переменной внутри.
2 варианта: либо вручную использовать замену апострофов на двойные апострофы, либо использовать sqlEscapeString.
androbro
312 / 272 / 51
Регистрация: 17.10.2014
Сообщений: 819
12.11.2014, 17:00     Правильно составить запрос, содержащий "'" #13
А они бэкслэшем не экранируются
Java
1
String name = \'Этуаль";
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
12.11.2014, 17:07     Правильно составить запрос, содержащий "'" #14
androbro, это не имеет смысла, потому что SQL не будет обращать внимания на "\'". Он будет обращать внимание, если распознает такое:
SQL
1
2
WHERE name = 'Л'Этуаль'
WHERE name = 'Л\'Этуаль'
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
13.11.2014, 09:04  [ТС]     Правильно составить запрос, содержащий "'" #15
Решил проблему неожиданно)
Java
1
2
String n = "=\"" + "Л'Этуаль" + "\"";       
"SELECT * FROM TABLE WHERE NAME " + n;
Но теперь проблема с текстом который содержит кавычки. Видимо придется все же проверять переменную на символы.

Добавлено через 10 часов 52 минуты
Java
1
2
3
public String replaceSingleQuote(String n) {    
    return "=" + (n.contains("'") ? "\"" + n + "\"" : "'" + n + "'");
}
dubok79
 Аватар для dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
14.11.2014, 08:38     Правильно составить запрос, содержащий "'" #16
Вместо конкретного символа используйте его UNICODE представление. Например, для LIKE '%слово%' тоже ругался на знак процента. Написав его в unicode, все прошло как по маслу. Правда, если заранее не знаете какие символы, то нужно делать проверку и замену. Удачи.
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
14.11.2014, 13:43     Правильно составить запрос, содержащий "'" #17
Я не понимаю, над чем до сих пор мучаетесь. Процент, конечно же, прекрасно работает в SQL-запросе, если запрос написан по правилам. Например, "WHERE LIKE '%%аб%'". Ещё есть вероятность получить SQL-инъекцию, но sqlEscapeString должна решать и этот вопрос.
Rube
910 / 558 / 87
Регистрация: 13.02.2014
Сообщений: 2,066
14.11.2014, 13:53  [ТС]     Правильно составить запрос, содержащий "'" #18
Цитата Сообщение от CoolMind Посмотреть сообщение
Я не понимаю, над чем до сих пор мучаетесь.
Это dubok79 мучается, я же проблему давно решил двумя постами выше.
dubok79
 Аватар для dubok79
323 / 121 / 11
Регистрация: 01.11.2012
Сообщений: 586
14.11.2014, 14:02     Правильно составить запрос, содержащий "'" #19
Я не мучаюсь, а предложил свой вариант, который тоже работает. Почему так, потому что с MySQL постольку поскольку, а в нем видать есть методы мне не известные и похоже вам тоже.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.11.2014, 13:00     Правильно составить запрос, содержащий "'"
Еще ссылки по теме:

SQLite, ошибка: не существует поля "почта" в базе данных Android
При компиляции вылазит ошибка Installation error: "INSTALL_FAILED_CPU_ABI_INCOMPATIBLE" Android
Услуга - "поругайте мой код" есть тут такая?) Android
"Error while reading RSS" при попытке загрузить новости Android
Android UnknownHostException: Unable to resolve host "api.openweathermap.org"

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
CoolMind
411 / 394 / 65
Регистрация: 06.10.2012
Сообщений: 1,701
15.11.2014, 13:00     Правильно составить запрос, содержащий "'" #20
dubok79, кстати, хорошо, что вы написали про процент. Проверил, действительно, процент не ищет, находит в итоге все записи. Я чего-то про такой вариант даже и не думал. Попробую ваш вариант.
Yandex
Объявления
15.11.2014, 13:00     Правильно составить запрос, содержащий "'"
Ответ Создать тему
Опции темы

Текущее время: 05:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru