Как написать предложение WHERE IN из динамического запроса ArrayList для Android SQLite - PullRequest
6 голосов
/ 19 августа 2011

Как мне написать предложение where в запросе Android SQLite?

Функция для получения одного клиента

public Cursor getCustomers(int groupId) {
    return db.query(TABLE_CUSTOMERS, new String[] { KEY_CUSTOMER_ID, KEY_NAME}, KEY_GROUP_ID+" = "+groupId, null, null, null, null);
}

Функция для получения большего числа клиентов

public Cursor getCustomers(ArrayList<Integer> groupIds) {
    // Need to apply SELECT id, name FROM customers WHERE id IN (11, 13, ...18);
    //return db.query(TABLE_CUSTOMERS, new String[] { KEY_CUSTOMER_ID, KEY_NAME}, KEY_GROUP_ID+" = "+groupIds, null, null, null, null);
}

Размер ArrayList groupId является динамическим.

Ответы [ 3 ]

15 голосов
/ 13 марта 2012

Вы можете использовать Android TextUtils метод объединения классов, чтобы создать разделенный запятыми список идентификаторов для включения в предложение in.

String selection = KEY_GROUP_ID + " IN (" + TextUtils.join(", ", groupIds) + ")";
return db.query(TABLE_CUSTOMERS, new String[] { KEY_CUSTOMER_ID, KEY_NAME}, selection, null, null, null, null);

BTW, если groupIds является списком первичныхключи из другой таблицы, вы должны использовать Long для хранения их, а не целых чисел, в противном случае они будут переполнены, когда идентификаторы станут большими.

4 голосов
/ 19 августа 2011
return db.query(TABLE_CUSTOMERS, new String[] { KEY_CUSTOMER_ID, KEY_NAME }, KEY_GROUP_ID + " >=" + groupIdsLowLimit + " and " + KEY_GROUP_ID + " <=" + groupIdsUpLimit, null, null, null, null);

String where = "";
for (int i = 0; i < list.size(); i++) {
    where = where + KEY_GROUP_ID + " =" + list.get(i).toString() + "";
    if (i != (list.size() - 1))
        where = where + " or";
}

return db.query(TABLE_CUSTOMERS, new String[] { KEY_CUSTOMER_ID, KEY_NAME }, where, null, null, null, null);
1 голос
/ 18 ноября 2016

Я хочу добавить что-то в @ JosephL's ответ согласно моему исследованию:

У меня есть два ArrayList со следующими значениями:

Первый ArrayList (в первом столбце) имеет повторяющиеся значения, а Второй ArrayList (во втором столбце) имеет уникальные значения.

=> 67 : 35
=> 67 : 36
=> 70 : 41
=> 70 : 42

Печать обоих после обработки, как показано ниже:

  1. Первый массив: "(" + TextUtils.join(",", arrayList1) + ")"
  2. Второй массив: "(" + TextUtils.join(",", arrayList2) + ")"
  3. Первый массив (удаление дубликатов с помощью new HashSet<>(arrayList1)):

    "(" + TextUtils.join(",", new HashSet<>(arrayList1)) + ")"

    => Первый массив: (67,67, 70,70)

    => Второй массив: (35,36,41,42)

    => Первый массив (удаление дубликатов с использованием new HashSet<>(arrayList1)): (67,70)

Надеюсь, это будет полезно.Спасибо.

...