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