当前位置: 首页 > 知识库问答 >
问题:

两个选择在android java给予例外

左丘楷
2023-03-14
String MY_QUERY = "select * from survey_tbl  WHERE " +
  "status = 'active' AND " +
  "mysql_sys_id = ?";
Cursor res = db.rawQuery(MY_QUERY, new String[] {
  String.valueOf(id)
});
res.moveToFirst();
//            finalmyArray = CreateJsonRecords(res);
while (res.isAfterLast() == false) {
  JSONObject k = new JSONObject();
  JSONObject l = new JSONObject();
  JSONObject m = new JSONObject();
  JSONObject n = new JSONObject();


  o.put("surveyid", res.getString(res.getColumnIndex("sys_id")));
  o.put("surveynum", res.getString(res.getColumnIndex("survey_num")));
  o.put("surveytitle", res.getString(res.getColumnIndex("survey_title")));
  o.put("surveydescription", res.getString(res.getColumnIndex("survey_description")));
  o.put("startdate", res.getString(res.getColumnIndex("start_date")));
  o.put("enddate", res.getString(res.getColumnIndex("end_date")));
  o.put("status", res.getString(res.getColumnIndex("status")));

  res.moveToNext();


}
String MY_QUERY1 = "select *,t1.mysql_sys_id AS questionsysid from " +
  "question_tbl AS t1 LEFT JOIN " +
  "survey_tbl AS t2 ON t2.mysql_sys_id = t1.survey_id WHERE " +
  "t2.status = 'active' AND " +
  "t2.mysql_sys_id = ?";
Cursor res1 = db.rawQuery(MY_QUERY1, new String[] {
  String.valueOf(id)
});
System.out.println("res1 " + res1);
if (res1 != null && res1.moveToFirst()) {
  //            res1.moveToFirst();
  do {
    //            while (res1.isAfterLast() == false) {
    //question
    o.put("mysqlsysid", res.getString(res.getColumnIndex("questionsysid")));
    o.put("questiondisplaynum", res.getString(res.getColumnIndex("question_display_order")));
    o.put("questionorder", res.getString(res.getColumnIndex("question_order")));
    o.put("questioncategory", res.getString(res.getColumnIndex("question_category")));
    o.put("question", res.getString(res.getColumnIndex("question")));
    o.put("status", res.getString(res.getColumnIndex("status")));

    //                    res1.moveToNext();

  } while (res1.moveToNext());
  //            }
} else {
  System.out.println(res1);
}

我使用这个查询在两个表上进行选择,然后将这两个结果添加到一个JSON对象中。这个问题给了我

Android数据库CursorIndexOutOfBoundsException:请求索引1,大小为1

行中的o.put(“mysqlsysid”,res.getString(res.getColumnIndex(“questionsysid”))

问题:

  1. 为什么我得到这个错误。
  2. 如何解决这个错误。

欢迎您提出任何建议

更新

为了确保光标不是空的,我添加了

System.out.println("getCount"res1.getCount());结果是

I/系统。输出:getCount 18

共有2个答案

赵骏奇
2023-03-14

您可以通过以下方式从游标获取数据:
游标游标=db。rawQuery(MY\u查询,新字符串[]{String.valueOf(id)});尝试{while(cursor.moveToNext()){//在此处获取数据}}最后{cursor.close;}

郑松
2023-03-14

嗯,我想你在这里读错了光标。

if (res1 != null && res1.moveToFirst()) {
  do {
    o.put("mysqlsysid", res.getString(res.getColumnIndex("questionsysid")));
    o.put("questiondisplaynum", res.getString(res.getColumnIndex("question_display_order")));
    o.put("questionorder", res.getString(res.getColumnIndex("question_order")));
    o.put("questioncategory", res.getString(res.getColumnIndex("question_category")));
    o.put("question", res.getString(res.getColumnIndex("question")));
    o.put("status", res.getString(res.getColumnIndex("status")));  
} while (res1.moveToNext());

因为您正在光标上循环,但您正在读取

所以基本上您正在尝试读取前一个光标,但您已经到达了第一个循环的末尾。

您应该关闭光标以防止这种情况发生。

PS:您可以使用while循环来删除if while(res1!=null

我不确定你是否需要检查光标是否存在(需要检查文档)

 类似资料:
  • 问题内容: 我正在寻找一个在Django日期之间进行选择的查询。 我知道如何使用原始SQL轻松做到这一点,但是如何使用Django ORM做到这一点呢? 这是我要在查询中添加30天之间的日期的地方: 问题答案: 使用运算符:

  • 问题内容: 我有两个表: 我想从表1中选择所有具有值A和B的表2行的行。这将是行1和3(不是2行,因为它只有A,没有4行是因为只有B)。我可以在没有子查询的情况下执行此操作吗? (注意:我还需要查询表1中的值,因此我不能只查询表2。) 问题答案: 塔达阿!没有子查询。

  • 我想从每个主机向用户授予select权限,但如果出现错误,则不允许创建用户 mysql 错误1410(42000):不允许使用GRANT创建用户 我不想创建新用户,因为我使用了命令create user 我试图创建一个新用户,但grant命令也失败了。

  • 问题内容: 两个或多个值中的最小值或最大值是可能的。我需要这样的东西: 我可以仅使用MySQL来实现吗? 问题答案: 您可以使用和功能来实现它。 两者都在这里描述了http://dev.mysql.com/doc/refman/5.0/en/comparison- operators.html

  • 问题内容: 我有两个用于查询表中行的SQL查询,具体取决于类型2或3。 查询1: 查询2: 现在,我只想获取和使用一个查询的值。如何使用一个查询获得计数。有没有办法做到这一点。我正在使用SQLite数据库。 编辑: 我想要分别为和的值,而不是两者都在一起(不使用)。 问题答案: 尝试使用 对于两个变量:

  • 我有两张桌子 客户(ID,First_Name,Last_Name,地址); 订单(ID,Product_Name,价格,Order_Date日期,Customer_ID,金额); 我必须选择客户的姓氏以及他们的订单数量。 select请求的输出必须是