Использование IN () динамически в SQLite - PullRequest
0 голосов
/ 14 мая 2018

У меня есть запрос ниже:

public List<ListCoursesFilterModel> getListSubject(List<String> lstLang) {
    StringBuilder langs = new StringBuilder();
    StringBuilder questionMark = new StringBuilder();
    for (int i = 0; i < lstLang.size(); i++) {
        langs.append(",").append(lstLang.get(i).toLowerCase());
        questionMark.append(",?");
    }
    String res = langs.substring(1, langs.length());
    String qs = questionMark.substring(1, questionMark.length());
    List<ListCoursesFilterModel> list = new ArrayList<>();
    SQLiteDatabase db = databaseHelper.getWritableDatabase();
    Cursor cursor = db.query(
            false,
            "ShortMajorTBL",
            null,
            "langId IN(" + qs + ") AND identifier =?",
            new String[]{res, "S300"},
            null,
            null,
            null,
            null
    );
    try {
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                do {
                    ListCoursesFilterModel listCoursesFilterModel = new ListCoursesFilterModel();
                    listCoursesFilterModel.setSubject(cursor.getString(cursor.getColumnIndex("subject")));
                    listCoursesFilterModel.setLangId(cursor.getString(cursor.getColumnIndex("langId")));
                    listCoursesFilterModel.setIsSelected(cursor.getString(cursor.getColumnIndex("isSelected")));
                    listCoursesFilterModel.setIdentifier(cursor.getString(cursor.getColumnIndex("identifier")));
                    listCoursesFilterModel.setTitle(cursor.getString(cursor.getColumnIndex("title")));
                    listCoursesFilterModel.setCount(cursor.getInt(cursor.getColumnIndex("count")));
                    list.add(listCoursesFilterModel);
                } while (cursor.moveToNext());
            }
            return list;
        }
    } catch (Exception ex) {
        Throwable t = new Throwable(ex).fillInStackTrace();
        FirebaseCrash.report(t);
    } finally {
        if (cursor != null) {
            cursor.close();
        }
    }
    return null;
}

lstLang, когда у меня есть одно значение - например, en - оно работает и получает результаты, но когда у меня несколько значений - например, en,fr,ar - не показывает никакого результата.

1 Ответ

0 голосов
/ 14 мая 2018

каждое ваших значений в предложении IN является строкой.
Следовательно, его необходимо экранировать в единственном числе.

Т.е.: 'en', 'fr', 'ar'.

Итак, есть что-то вроде

...
qs = `'en', 'fr', 'ar'`; // somehow buid this dynamically
...
"langId IN(" + qs + ") AND identifier =?",
...
...