【问题标题】:Pass string variable to db helper and use in query将字符串变量传递给 db helper 并在查询中使用
【发布时间】:2015-05-14 12:42:11
【问题描述】:

我创建了两个字符串变量,“questionString”和“answerSetId”——我已将第一个变量分配给一个 textview——我想将第二个变量传递给我的 db helper 类:

    public void showNextRandomQuestion3() {

        SQLDatabaseHelper db = new SQLDatabaseHelper(this);

        //get the data from the database
        List<List<String>> listList = db.getAllAnswersByQuestion1();

        //Get the question/text/answer Strings
        List<String> questionStrings = listList.get(0); //question Strings
        List<String> answerSetIds = listList.get(4);

        //Generate random index
        Random r = new Random();
        int rand = Math.abs((r.nextInt() % questionStrings.size()));

        //get answer description for randomly selected question
        String questionString = questionStrings.get(rand);  
        String answerSetId = answerSetIds.get(rand); 

        questionView.setText(questionString);

        }

在我的数据库助手类中,我想使用这个字符串变量作为我的查询:

public List<List<String>> getAnswers() {

    List<String> array1 = new ArrayList<String>();    
    List<String> array2 = new ArrayList<String>();  

    SQLiteDatabase db = this.getReadableDatabase();

    String selectQuery = "SELECT  * FROM " + TABLE_ANSWERS + "WHERE " + ASID
            + " = " + ??answerSetId??;

   Cursor c = db.rawQuery(selectQuery, null);
   if (c.moveToFirst()) {
    do {

     String textdescr = c.getString(c.getColumnIndex(TDESCR));
     String answersdescr = c.getString(c.getColumnIndex(ADESCR));
     array1.add(textdescr);
     array2.add(answersdescr);;

    } while (c.moveToNext());

 }
   List< List<String> > listArray2 = new ArrayList< List<String> >();
   listArray2.add(array1);
   listArray2.add(array2);

   return listArray2;
}

实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: android arrays android-intent get


    【解决方案1】:

    为了执行 SELECT,您可以使用 this method

    query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)
    

    而不是原始查询。在你的情况下:

    String selection = ASID+"=?";
    String selectionArgs[] = new String[]{String.valueOf(answerSetId)};
    Cursor c = db.query(TABLE_ANSWERS, null, selection, selectionArgs, null, null, null);
    

    您还可以选择一些特定的列,将列名称列表作为第二个参数(insted of null)传递。此外,您可以替换示例中的最后三个空值以添加GROUP BY、HAVING 和ORDER BY 子句。

    例如,在您的查询中,您只对 TDESCR 和 ADESCR 两列感兴趣。所以你可以使用这个查询:

    String[] columns = new String[]{TDESCR, ADESCR};
    String selection = ASID+"=?";
    String[] selectionArgs = new String[]{String.valueOf(answerSetId)};
    Cursor c = db.query(TABLE_ANSWERS, columns, selection, selectionArgs, null, null, null);
    

    还有很多其他的覆盖方法查询。看看文档here

    但是,如果您愿意,可以通过这种方式执行原始查询:

    String queryString = "SELECT * FROM " + TABLE_ANSWERS +
        " WHERE "+ASID+"=?";
    String[] selectionArgs = new String[]{String.valueOf(answerSetId)};
    sqLiteDatabase.rawQuery(queryString, selectionArgs);
    

    【讨论】:

    • 非常好 - 谢谢。对于我的问题的第一部分 - 如何将“answerSetId”从主要活动传递给 db helper?
    • 只需修改你的方法getAnswers(String answerSetId)
    • 再次感谢 - 可能要求绝对明显,但我需要添加到我的主要活动方法“showNextRandomQuestion3()”以传递“answerSetId”。
    • 我想你的数据库助手正在扩展SQLiteOpenHelper,所以你可以将方法showNextRandomQuestion3()声明为静态,并以这种方式从你的主要活动中调用它:DbHelper.showNextRandomQuestion3()。但是考虑一种更清晰和模块化的管理方式,它使用 DAO 类,它封装了访问数据库所需的所有方法。查看this example,可以看到名为CommentsDataSource的DAO类
    • @jrgart 如果我的回答对您有帮助,请考虑接受;)
    猜你喜欢
    • 2017-11-15
    • 2012-06-25
    • 2012-04-24
    • 1970-01-01
    • 2019-02-15
    • 1970-01-01
    • 2015-12-25
    • 2020-05-27
    • 2020-06-16
    相关资源
    最近更新 更多