当我使用光标方法从sqlite获取数据时,应用程序会崩溃



这是我的代码,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;

不确定,但是您可以尝试这些,

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

不是绝对是问题,但是您不应该通过不检查moveToFirst方法的结果来假设光标不是空的。也就是说,如果无法进行移动,例如moveToFist将返回false。如果光标为空。

如果光标是空的,则moveToFist不会失败,但是尝试通过get????方法检索数据,然后在尝试访问光标0时,如果没有行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();

注意,如果光标本身为空,则LSDATA将没有元素。您可以在cursor.close()之后和return lsData之前添加一些内容: -

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

然后很容易查看光标是否为空。

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

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

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

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

最新更新