Intereting Posts
Через некоторое время мое приложение зависает во время прокрутки WebView, говоря «не удалось заблокировать поверхность», Android – что такое иерархия представлений? Почему Android запускает синхронизацию учетной записи Google каждый раз, когда я добавляю / удалю учетную запись пользовательского типа? Отключить рейтинг на RatingBar Скрыть мягкую клавиатуру не работает Как удалить строку правого поля в Android Studio (Intellij)? Сервис или связанный сервис? DialogFragment с setRetainInstanceState (true) не отображается после поворота устройства Получить отметку времени для начала дня Учетная запись Google Play Publisher завершена, может ли другой разработчик опубликовать мои приложения? Как начать другое действие с некоторой задержкой после нажатия кнопки в android? Событие onClick не запускается | Android Как протестировать корпоративное приложение Android на разных устройствах Не удается заставить ScrollView прокручиваться, когда отображается мягкая клавиатура Android M: Разрешения на выставление счетов и GCM

Синтаксис Android Sqlite IN, NOT IN

Я пытаюсь запустить NOT IN select, где NOT IN list является динамическим. Что-то вроде

 SELECT id, type FROM CONTACTS where type NOT IN ('connect','answer') 

В коде мои бесполезные попытки были:

 db.query(TABLE, new String[] { "id", ""}, " type NOT IN (?)", "connect,answer", null, null, null); // didn't work db.query(TABLE, new String[] { "id", ""}, " type NOT IN (?)", "'connect','answer'", null, null, null); // didn't work 

Я так понимаю ? Подстановка рассматривает мой список запятой как один аргумент. Я нашел решение, но он довольно уродлив, поэтому я не буду публиковать его здесь, пока кто-то не предложит что-то более элегантное

Solutions Collecting From Web of "Синтаксис Android Sqlite IN, NOT IN"

Вы не можете разместить только один '?' Вместо списка значений. Таким образом, от попыток параметризации списков немного выиграть. Разумеется, можно создать подготовленные утверждения в количестве 2,4,16 ..." type NOT IN (?,?)", new String[]{ "connect","answer" },... но даже на Сервер с удаленной РСУБД имеет сомнительное значение. Вместо этого

 db.query(TABLE, new String[] { "id", ""}, " type NOT IN ('connect','answer')", null, null, null, null); 

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

Вы можете использовать String.format для динамического набора аргументов.

например:

 db.query(TABLE, new String[] { "id", ""}, " type NOT IN (?)", "connect,answer", null, null, null); 

=>

 String argsArrayToString(List<String> args) { StringBuilder argsBuilder = new StringBuilder(); argsBuilder.append("("); final int argsCount = args.size(); for (int i=0; i<argsCount; i++) { argsBuilder.append(args.get(i)); if (i < argsCount - 1) { argsBuilder.append(","); } } argsBuilder.append(")"); } db.query(TABLE, new String[] { "id", ""}, String.format(" type NOT IN (%s)", argsArrayToString(arrays)), null, null, null, null); 

Вы можете динамически использовать «не в», если вы динамически создаете строку, содержащую список значений «не в», а затем добавьте их в конец строки sql, как показано ниже:

 public static Vector selectAllFormTypesForAccountIgnoringFormVersions( int accountId, String formsIgnored) { protected final static String selectAllFormTypesForAccountIgnoringFormVersions = "SELECT DISTINCT FormType.*" + " FROM FormType, Form WHERE Form.accountId=? AND FormType.formTypeContentId = Form.formTypeContentId" + " AND Form.formVersionId NOT IN ("; Vector allFormTypes = new Vector(); SQLiteDatabase db = null; String[] selectionArgs = { Integer.toString(accountId)}; try { DataManager_Platform dataManager = (DataManager_Platform) DataManager_Platform .getDataManager(); db = (SQLiteDatabase) dataManager.getDatabase(); Cursor cursor = db.rawQuery( selectAllFormTypesForAccountIgnoringFormVersions + formsIgnored + ")", selectionArgs); if (cursor.getCount() > 0) { cursor.moveToFirst(); while (!cursor.isAfterLast()) { FormType_Platform formType = new FormType_Platform(); formType.populateModel(cursor); allFormTypes.add(formType); cursor.moveToNext(); } } } catch (Exception e) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } finally { try { if (db != null) { db.close(); } } catch (Exception e) { System.out.println("Error: " + e.getMessage()); e.printStackTrace(); } } return allFormTypes; }