当我使用Cursor方法从SQlite获取数据时,应用程序崩溃

时间:2017-12-07 03:58:54

标签: java android sqlite cursor

这是我的代码,Cursor cursor= db.rawQuery是原因。我的应用程序一直在崩溃

请告诉我错误: -

public QuestionController(Context context) {
    dbHelper= new DBHelper(context);
}

//Lấy danh sách câu hỏi
public ArrayList<Question> getQuestion(int num_exam, String subject){
    ArrayList<Question> lsData= new ArrayList<Question>();
    SQLiteDatabase db= dbHelper.getReadableDatabase();

    Cursor cursor= db.rawQuery("SELECT * FROM tracnghiem WHERE num_exam = '"+ num_exam+"' AND subject='"+subject+"' ORDER BY random()",null);
    cursor.moveToFirst();
    do {
        Question item;
        item= new Question(cursor.getInt(0), cursor.getString(1),cursor.getString(2),cursor.getString(3),
                cursor.getString(4),cursor.getString(5),cursor.getString(6),cursor.getInt(7),cursor.getString(8),cursor.getString(9),"");
        lsData.add(item);
    }while (cursor.moveToNext());
    cursor.close();
    return lsData;

4 个答案:

答案 0 :(得分:0)

不确定,但你可以尝试这些,

db.rawQuery("SELECT * FROM tracnghiem WHERE num_exam = ? AND subject=? ORDER BY random()", new String[] {num_exam,subject});

答案 1 :(得分:0)

不是肯定是问题,但是你不应该假设Cursor不是空的,不检查moveToFirst方法的结果。如果无法进行移动,则moveToFist将返回false。如果光标是空的。

如果光标为空,moveToFist将不会失败但是,当您尝试访问游标的第0行时,尝试通过get????方法检索数据将失败,并出现行索引错误当没有第0行时。

同样不是说这绝对是你遇到的错误。但是你应该替换: -

cursor.moveToFirst();
do {
    Question item;
    item= new Question(cursor.getInt(0), cursor.getString(1),cursor.getString(2),cursor.getString(3),
            cursor.getString(4),cursor.getString(5),cursor.getString(6),cursor.getInt(7),cursor.getString(8),cursor.getString(9),"");
    lsData.add(item);
}while (cursor.moveToNext());
cursor.close();

使用类似的东西(如果光标不为空,这将循环通过光标,如果光标为空则不会失败): -

while (cursor.moveToNext) {
    Question item;
    item= new Question(cursor.getInt(0), cursor.getString(1),cursor.getString(2),cursor.getString(3),
            cursor.getString(4),cursor.getString(5),cursor.getString(6),cursor.getInt(7),cursor.getString(8),cursor.getString(9),"");
    lsData.add(item);
}
cursor.close();

如果Cursor本身为空,请注意lsData没有元素。您可以在cursor.close()之后和return lsData之后添加以下内容: -

if (lsData.size) < 1) {
    lsData.add(new Question(0,"Empty Cursor","","","","","",0,"".""."");
}

然后可以很容易地看出Cursor是否为空。

答案 2 :(得分:0)

我认为问题在于这一行,在行cursor.moveToFirst();之前检查一个条件。

if(cursor!=null && cursor.getCount() > 0){
   if(cursor.moveToFirst()){
       //your process for fetching row.
   }
}

答案 3 :(得分:0)

在您的情况下,崩溃应用程序只能有3个泄漏,

  • 与DB建立连接不合适。
  • 错误的查询(表中的表或字段不存在于DB中)。
  • 您的cursor返回0行。