带有动态Where子句的Android rawquery

时间:2014-01-23 04:51:31

标签: android sqlite

我正在尝试在Android中执行SQL查询,如下所示:

SELECT * FROM Flashcards WHERE (category = 'Anatomy' OR category = 'Surgery') AND (difficulty = 'Easy' OR difficulty = 'Medium');

通过用户选择在运行时确定类别和困难的数量。到目前为止,我已尝试将原始查询与查询参数一起使用,但我觉得我在这种情况下正在与框架作斗争:

String query = "SELECT * FROM Flashcards WHERE (?) AND (?) ORDER BY RANDOM() LIMIT 1";
    Cursor cursor = db.rawQuery(query, queryParameters);

我尝试传入的查询参数包括:

category = 'Anatomy' OR category = 'Surgery'

category = Anatomy OR category = Surgery

查询不会返回任何结果。在外部对同一数据库执行的相同查询会返回结果。

4 个答案:

答案 0 :(得分:5)

尝试:

String query = "SELECT * FROM Flashcards WHERE category = ? OR category = ? ORDER BY RANDOM() LIMIT 1";
Cursor cursor = db.rawQuery(query, queryParameters);

仅供参考,参数的位置应该用?登录。

更新

由于您希望传递字段名称和值运行时,您可以构建格式化字符串,例如:

String query = "SELECT * FROM Flashcards WHERE %s AND %s ORDER BY RANDOM() LIMIT 1";
Cursor cursor = db.rawQuery(String.format(query, queryParameters));

您必须使用queryParameters之类的内容构建category = 'Anatomy' OR category = 'Surgery'值。

答案 1 :(得分:5)

我总是发现原始查询的串联字符串容易出错且乏味。我最近在Android上发布了用于sqlite操作的流畅API的初稿。有了它,您可以编写如下代码:

public void getFlashcards(SQLiteDatabase db, List<String> categories, List<String> difficulties) {
  Cursor c = select()
      .from("Flashcards")
      .where(column("category").in(nArgs(categories.size())), categories.toArray())
      .where(column("difficulty").in(nArgs(difficulties.size())), difficulties.toArray())
      .orderBy("RANDOM()")
      .limit(1)
      .perform(db);

  // do something useful with the cursor
}

private Expression[] nArgs(int size) {
  return Collections.nCopies(size, Expressions.arg()).toArray(new Expression[size]);
}

此代码将执行以下查询:

SELECT * FROM Flashcards WHERE (category IN (?, ?)) AND (difficulty IN (?, ?)) ORDER BY RANDOM() LIMIT 1;

? args的数量取决于传递给函数的类别和困难集合的大小。作为奖励点,由于查询使用绑定的args而不是原始字符串,因此您的输入将被正确转义,并且此查询的预准备语句对SQLiteDatabase内的缓存更友好。

API仍然不完美,但IMO基于String.format()击败了代码。给它一个旋转:android-db-commons

答案 2 :(得分:1)

试试这个

Select * from table_name where contains(fieldname,' "value1" OR "value2" OR "value3"')

你所拥有的其他一切看起来都很好。这在过去对我有用。添加尽可能多的OR

好的'喜欢和脚背得到SQLite支持

SELECT *  FROM TABLE  WHERE instr(column,' "value1" OR "value2" OR "value3"'  );

SELECT *  FROM TABLE  WHERE like(column,' "value1" OR "value2" OR "value3"') 

另外,请记住,LIKE不区分大小写,而instr区分大小写。

答案 3 :(得分:0)

这是android的SQLiteDatabase类中的一个错误。

似乎“category”是android SQLiteDatabase代码中的一个关键词,并且当在android端的where子句中写入时,查询不返回任何内容。

我也遇到了这个问题,并将我的专栏名称从“category”更改为其他问题解决了这个问题。