Android Sqlite IN, а не IN синтаксис - PullRequest
21 голосов
/ 16 января 2011

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

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

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

Ответы [ 3 ]

21 голосов
/ 16 января 2011

Вы не можете поместить только один '?' вместо списка значений. Таким образом, от параметризации списков мало что можно выиграть. Можно, конечно, создавать подготовленные операторы с значением 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);
если список динамический, вам нужно будет экранировать строки и поместить их в одинарный список в кавычках.
3 голосов
/ 04 марта 2014

Вы можете использовать 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);
1 голос
/ 16 марта 2011

Вы можете динамически использовать «not in», если вы динамически создаете строку, содержащую список значений «not in», а затем добавляете их в конец строки 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...