Одиночная кавычка (') в тексте редактирования приводит к сбою моей программы

1

Если я напишу что-нибудь в edittext, содержащем одинарную кавычку ('), моя программа edittext строя. С помощью этого edittext я могу искать вещи в своей базе данных, и некоторые из них содержат этот единственный qoute (или апостроф независимо от его имени, но дело в том, что это о единственном qoute). Я предполагаю, что у него есть специальные функции, и поэтому он падает. Есть ли возможность игнорировать его функцию или решить эту проблему?

например, элемент в моей базе данных:

cv.put(KEY_NAME, "Jonh idea");
cv.put(KEY_HOTNESS, "amazing");
cv.put(KEY_MONEY, "500");
ourDatabase.insert(DATABASE_TABLE, null, cv);

Затем, когда я ищу его с помощью этого метода:

return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name",},  
"idea_name like " + "'%" + qq + "%'", null, null, null, null);

где qq задается пользователем (например, идея Джона), он сует. И да, я получаю синтаксическую ошибку.

  • 1
    Можете ли вы показать некоторые из ваших работ? Является ли это ' в файле XML или в коде? Можете ли вы показать часть XML или кода, который добавляет этот символ в поле? Кроме того, что вы пытались решить проблему?
  • 0
    Попробуйте: return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name"}, "idea_name like '%?%'", new String[] { qq }, null, null, null);
Показать ещё 2 комментария
Теги:
android-edittext
quote

4 ответа

1
Лучший ответ

Вам нужно использовать аргумент selectionArgs чтобы избежать строки (так что одинарная кавычка в ней не нарушает SQL). Попробуйте что-то вроде этого:

return ourDatabase.query(DATABASE_TABLE, new String[] {"_id", "idea_name",}, "idea_name like ?", new String[] { "%" + qq + "%" }, null, null, null);
  • 0
    все еще синтаксическая ошибка
  • 0
    К сожалению, извините: ? , не % . Проверьте мой обновленный пост.
Показать ещё 1 комментарий
2

Похоже, что ' вызывает SQL-инъекцию какого-то типа... ' вызывает синтаксическую ошибку в вашем SQL-заявлении. Есть несколько вещей, которые вы можете рассмотреть с помощью двойной проверки:

  1. rawQuery() не защитит вас от SQL-инъекций, поэтому не используйте его (вместо этого используйте методы query, insert, update и delete).

  2. Предпочитаете форматировать свой selection и selectionArgs следующим образом (так как он защитит вас от SQL-инъекций):

    selection = "col_1 = ?";
    selectionArgs = new String[] { "value_1" };
    

    (обратите внимание, что значения в String[] заменяют ? в строке selection).

  3. Задайте inputType на вашем EditText чтобы пользователи не inputType эти символы в первую очередь (т. android:inputType="number" Если вы хотите, чтобы пользователи вводили числа, а затем установите android:inputType="number").

  4. В целом, если вы правильно используете методы Android в классе SQLiteDatabase, вы не должны столкнуться с какими-либо проблемами с SQL-инъекциями (Android отлично справляется с этим, чтобы очистить это для вас). Тем не менее, если вы не захотите использовать эти специальные методы, вы должны проверить содержимое String во время выполнения и защитить от таких символов, как ', ; , " и т.д., избегая их.

Вы можете обратиться к этому сообщению за дополнительной информацией:

Android Single Quote В SQL С LIKE StateMent

0

Еще один югаад. Вы можете заменить 'на'. Вам не придется проверять свой код. Просто измените следующее:

String input = edittext.getText().toString();

if(input.contains("'"))
{
   input = input.replace("'", "'");
}
//now proceed with the database operation ...

Это позволит пользователю вводить текст, например RD jugaad, в RD jugaad

0

Это похоже на SQL-инъекцию. U должен избегать ввода.

Ещё вопросы

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