【问题标题】:WHERE IN clause in Android sqlite?Android sqlite中的WHERE IN子句?
【发布时间】:2011-09-09 16:09:33
【问题描述】:

我无法让 WHERE IN 子句在 android SQLite 数据库上工作。

有没有办法在android中执行这样的语句? :

SELECT body FROM table1 WHERE title IN ('title1', 'title2', 'title3')

【问题讨论】:

  • 您遇到了什么异常?你的代码是什么样的?

标签: android database sqlite where clause


【解决方案1】:

您必须使用rawQuery 方法:

Cursor c = db.rawQuery("SELECT body FROM table1 WHERE title IN ('title1', 'title2', 'title3')");

【讨论】:

  • 谢谢!有效。我以前尝试过这种方式,但显然我遇到了一些语法问题......
  • 由于rawQuery如果我们传递动态参数很容易被SQL注入,你能建议在没有rawQuery的情况下得到类似的结果吗?
【解决方案2】:

如果您使用的是内容提供者,您可以这样使用查询功能:

getContentResolver().query(URI,new String[] {"body"}, "title IN ?", new String[] {"('title1','title2','title3')"}, null)

请注意,我没有对此进行测试,但根据文档,这应该可以工作。

【讨论】:

  • 这在 Android 4.0.4 中不起作用 - SQLite 包装类抛出异常
  • 这行不通。它将被翻译成SELECT body FROM table1 WHERE title IN '('title1', 'title2', 'title3')'。请注意整个参数部分周围的's。
【解决方案3】:

另一种方法

Cursor mCursor = SQLiteDatabase.query(true, "Name of table","String array of selection columns","title  in ('title1', 'title2', 'title3')", null, null, null, null, null);
if (mCursor != null) {
    mCursor.moveToFirst();
}

【讨论】:

    【解决方案4】:

    请看一下这个answer。它在类似的情况下帮助了我。

    String[] names = { "name1", "name2" }; // do whatever is needed first
    String query = "SELECT * FROM table" + " WHERE name IN (" + makePlaceholders(names.length) + ")";
    Cursor cursor = mDb.rawQuery(query, names);
    

    这里的要点是提供可变问号占位符 (?) 以匹配您的 IN 子句项。当然 - 将它们作为字符串数组的参数。

    【讨论】:

    • 您知道如何使用 INT[] 数组来执行此操作吗?我应用 IN 的列是 INTEGER 类型。
    • 您必须将任意数组转换为 String[]
    【解决方案5】:

    您可以使用TextUtils.join(",", parameters) 来利用sqlite 绑定参数,其中parameters 是一个带有"?" 占位符的列表,结果字符串类似于"?,?,..,?"

    这是一个小例子:

    Set<Integer> positionsSet = membersListCursorAdapter.getCurrentCheckedPosition();
    List<String> ids = new ArrayList<>();
    List<String> parameters = new ArrayList<>();
    for (Integer position : positionsSet) {
        ids.add(String.valueOf(membersListCursorAdapter.getItemId(position)));
        parameters.add("?");
    }
    getActivity().getContentResolver().delete(
        SharedUserTable.CONTENT_URI,
        SharedUserTable._ID + " in (" + TextUtils.join(",", parameters) + ")",
        ids.toArray(new String[ids.size()])
    );
    

    【讨论】:

    • 谢谢。这对我帮助很大。我不知道我必须为“IN”子句中的每个参数提供一个单独的占位符('?')。我认为带有单个字符串参数的单个占位符(其中加入了多个值)就足够了。
    • 这是你做的吗?字符串 where = ContactsContract.RawContacts.CONTACT_ID + " IN (? ?)";
    【解决方案6】:

    添加到克里斯蒂安的答案: 虽然他的回答会起作用,但您应该尝试使用正确的查询方式:

    db.rawQuery("Select * from table1 where title = ?", new String[]{param1});

    这种方式也可以和 WHERE IN 子句一起使用,但是传递的字符串必须是 'asd','zxc','qwe' 的格式

    像这样:

    String param1 = "\'asd\',\'zxc\',\'qwe\'";
    db.rawQuery("Select * from table1 where title in (?)", new String[]{param1});
    

    【讨论】:

      【解决方案7】:

      你需要这样写 rawquery -

       Cursor cursor = db.rawQuery("SELECT colunm1 FROM table WHERE colunm2 IN ('value1', 'value2', 'value3')", null);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-19
        • 2014-03-18
        • 1970-01-01
        • 2016-03-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多