【问题标题】:Android SQLite rawQuery - How to select multiple rows of a tableAndroid SQLite rawQuery - 如何选择表的多行
【发布时间】:2020-06-17 14:13:52
【问题描述】:

我正在尝试使用 rawQuery 返回一个游标,其中包含要传递给它的几行不同的数据。当只有 1 个参数时,它有效。当有超过 1 个参数时,它显示空 ListView 状态。我相信问题出在这里:

// Query for items from the database and get a cursor back. Edited code for clarity:
        recipeCursor = db.rawQuery("SELECT  course, name, _id " +
                " FROM recipes WHERE _id = ?",
                selectedRecipesSQL);

当代码运行时,selectedRecipesSQL 看起来像:

String[] selectedRecipesSQL;
selectedRecipesSQL = new String[]{"2"};

当它不起作用时,它会像

String[] selectedRecipesSQL;
selectedRecipesSQL = new String[]{"2 OR 5"};

所以,明确地说,我可以在我的 ListView 中显示表格的一行,但如果我尝试显示多行表格,那么它不会显示任何内容。

我想到的一个丑陋的解决方案(但我没有追求)是我需要编辑 rawQuery 选择语句以读取如下内容:

recipeCursor = db.rawQuery("SELECT  course, name, _id " +
                " FROM recipes WHERE _id = ? OR _id = ? OR _id = ?",
                selectedRecipesSQL);

我可能会使用 for 循环来生成正确数量的 WHERE "_id = ?"然后使用字符串数组:

selectedRecipesSQL = new String[]{"2", "5"};

【问题讨论】:

    标签: java android sql


    【解决方案1】:

    一种方法是将_id 的可能值作为 1 个字符串传递,这是一个逗号分隔的列表,如下所示:

    selectedRecipesSQL = new String[]{"1,2,3"};
    

    并在您的查询中使用运算符LIKE:

    recipeCursor = db.rawQuery(
      "SELECT course, name, _id FROM recipes WHERE ',' || ? || ',' LIKE '%,' || _id || ',%'",
      selectedRecipesSQL
    );
    

    这也仅适用于 1 个值。

    【讨论】:

      【解决方案2】:
                          static String multiply__concat_string(String text,String joiner_,int multiple_)
                          {
                              String output="";
                              for(int i=0;i<multiple_;i++)
                              {
                                  output+=(text+joiner_);
                              }
                              if(output.length()>0)
                              {
                                  output=output.substring(0,output.length()-1);
                              }
                              return output;
                          }
      

      像这样使用它:

      selectedRecipesSQL = new String[]{"2", "5"};
                          db.rawQuery("SELECT  course, name, _id " +
                          " FROM recipes WHERE _id IN("+multiply_concat_string("?",",",selectedRecipesSQL.length)+")",
                          selectedRecipesSQL);
      

      【讨论】:

      • 嗯,这行得通,但我也通过将 rawQuery 更改为:recipeCursor = db.rawQuery("SELECT course, name, _id " + " FROM recipes WHERE _id = "selectedRecipesSQL , 空值);。这看起来更干净、更简单、更快,即使它没有以正确的方式使用 rawQuery。以“正确”的方式进行操作有什么好处?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 2013-07-30
      • 2012-08-29
      • 2021-04-28
      • 1970-01-01
      相关资源
      最近更新 更多