android - 在 SQLite 中动态使用 IN()

标签 android sqlite android-sqlite android-cursor

我有以下查询:

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 - 它不显示任何结果。

最佳答案

每个 IN 子句中的值都是一个字符串。
因此,它必须被单独转义。

即:'en', 'fr', 'ar'

所以,有类似的东西

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

关于android - 在 SQLite 中动态使用 IN(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50325641/

相关文章:

android - 数据库磁盘镜像格式错误或文件已加密或不是数据库

java - 在数据库中搜索行不起作用,字符串比较错误

android - 删除数据库中的命令

android - java.lang.OutOfMemoryError 在 android.graphics.BitmapFactory.decodeResource (BitmapFactory.java :374)

android - 错误选项卡中的 progressDialog

javascript - Android 在滚动事件更新内容时设置 scrollLeft 不更新滚动条位置

java - 数据未从数据库正确返回

android - 在我的应用程序中使用 viewpager

php - 如何使用 PHP 连接到 SQLite 数据库?

java - 将表或项目列表添加到 SQLite