ORMLite запрос с цитатой, Android

Я использую ORMLite, с таблицей RecentSearch:

@DatabaseTable(tableName = LocalStorageConfig.SQL_RECENTS_TABLE_NAME) public class RecentSearch { @DatabaseField public String search_text; public static String SQL_SEARCH_FIELD = "search_text"; @DatabaseField public String location_text; public static String SQL_LOCATION_FIELD = "location_text"; @DatabaseField public Date creation_date = new Date(); public static String SQL_CREATION_DATE_FIELD = "creation_date"; 

Он работает почти все время, но когда я обнаруживаю случай с String, содержащий a ', то это, кажется, проблема. Вы знаете, как это решить? Я не мог найти то, что искал.

Вот моя функция, чтобы удалить последнее

 public boolean deleteRecent(RecentSearch search) { try { Dao<RecentSearch, Integer> recentsDao = recentsSqlManager.getRecentsDao(); DeleteBuilder<RecentSearch, Integer> deleteBuilder = recentsDao.deleteBuilder(); deleteBuilder.where().eq(RecentSearch.SQL_SEARCH_FIELD, search.getSearch_text()).and().eq(RecentSearch.SQL_LOCATION_FIELD, search.location_text); recentsDao.delete(deleteBuilder.prepare()); return true; } catch (Exception e) { Log.e(TAG, "Database exception", e); return false; } } 

Вот Исключение, которое я получаю:

 java.sql.SQLException: Problems executing Android statement: DELETE FROM `recent_searches` WHERE (`search_text` = '' AND `location_text` = 'Villefranche-d'Allier, Allier' ) at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22) at com.j256.ormlite.android.AndroidCompiledStatement.runUpdate(AndroidCompiledStatement.java:66) at com.j256.ormlite.stmt.StatementExecutor.delete(StatementExecutor.java:425) at com.j256.ormlite.dao.BaseDaoImpl.delete(BaseDaoImpl.java:347) ... Caused by: android.database.sqlite.SQLiteException: near "Allier": syntax error: , while compiling: DELETE FROM `recent_searches` WHERE (`search_text` = '' AND `location_text` = 'Villefranche-d'Allier, Allier' ) at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92) at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65) at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83) at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:41) at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1149) 

В ORMLite , когда вы пытаетесь создать запрос с кавычками, вы должны использовать функцию SelectArg которая будет генерировать запрос с SQL? Аргументы, а затем передать строку непосредственно в подготовленный оператор. Это обостряет любые проблемы с экранированием специальных символов, а также защищает вас от проблем безопасности SQL-инъекций. См. Документацию по SelectArg .

С помощью SelectArg вы бы сделали что-то вроде:

 DeleteBuilder<RecentSearch, Integer> deleteBuilder = recentsDao.deleteBuilder(); // create our argument which uses a SQL ? SelectArg locationArg = new SelectArg(search.location_text); deleteBuilder.where().eq(RecentSearch.SQL_SEARCH_FIELD, search.getSearch_text()) .and().eq(RecentSearch.SQL_LOCATION_FIELD, locationArg); recentsDao.delete(deleteBuilder.prepare()); ... 

Вы можете использовать объект SelectArg при привязке к вашему запросу, так как это позволит избежать любых кавычек, чтобы они не генерировали недопустимый sql.

Intereting Posts
Приложение для конкретного уникального устройства Удалить первые N строк в базе данных android sqlite ScrollView не прокручивается вообще Как решить ошибку «HeapWorker вклинивается» в Android? Форма кольца Android для переключателя ViewHolder не как внутренний класс Поиск быстрых алгоритмов искажения изображения Как определить, эмулируется ли мобильное устройство Google Chrome? Завершение всех мероприятий, начатых до начала деятельности Как извлечь ссылочную ссылку на атрибуты MotionEvent.ACTION_DOWN в Android слишком чувствителен. Это событие принимается, даже если экран просто коснулся на мгновение Где код примера / tutorial для Viewpager, который отлично подходит для всех? Отправить электронное письмо с приложением из внутреннего хранилища Создать новое сообщение с помощью API-интерфейса Facebook Как включить автоматическую загрузку отсутствующих пакетов Android SDK в Gradle