Intereting Posts
XmlPullParserException при анализе файла ресурсов в Android Как вводить входные события в собственное приложение на Android? Интеграция базового исходного кода Android в Ecplise Как перемещать camra на определенный маркер в google maps v2 в android Если я использую SSLSocket в Android и жесткий код, код доступа к доверенности в исходном коде небезопасен? Как центрировать кнопки на экране по горизонтали и вертикали плюс равноотстоящие друг от друга? Как я могу динамически создавать элементы меню? Мобильные приложения: restful api или sdk dynamodb Не все данные, показанные, когда логарифмический режим Android читается программно Портрет для телефона, альбом для планшета (Android-макет) Широковещательный приемник не работает после перезагрузки устройства в Android Как я могу получить отпечаток MD5 от keytool от Java, а не только SHA-1? Получить и установить таблицу цветов растрового изображения в android Как отобразить существующий ListFragment в диалоговом окне DialogFragment Получение поддержкиFragmentManager без расширения FragmentActivity

Синтаксис 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 

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

Вы не можете разместить только один '?' Вместо списка значений. Таким образом, от попыток параметризации списков немного выиграть. Разумеется, можно создать подготовленные утверждения в количестве 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; }