Intereting Posts
Пользовательский текстовый формат BottomNavigationView поддерживает андроид WebSocket поддерживается в Android Stock Browser или нет? Выровняйте два TextViews, один из них слева направо, в ListView, не растягивая фоны __ANDROID__ макрос внезапно не определен Какое Android-устройство следует покупать для разработки приложений для Android? Flash в Android WebView – проблема слоизации Как писать текст справа налево (арабский текст) на Android? Не удается найти searchview в панели действий для работы Log <GATE-M> DEV_ACTION_COMPLETED </ GATE-M>, похоже, задерживает выполнение на Android Несовместимые плагины для android-apt после обновления до Android Studio 2.3 Пользовательская позиция подсказки в поле «Редактировать текст». Android – приложение для тестирования на Galaxy S8 или LG G6 ProgressBar в ActionBar, например, приложение GMail с обновлением Как установить цвет TextView в Android? Cocos2d-xv 2.0.4 FATAL EXCEPTION GLThread при запуске на эмуляторе Android

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) 

Solutions Collecting From Web of "ORMLite запрос с цитатой, Android"

В 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.