产生原因:
在一个数据库增删改查方法中调用了另一个数据库查询方法,注意:每个线程只能使用一个SQLiteOpenHelper,也就使得每个线程也只有一个SQLiteDatabase对象(多线程操作数据库会报错),不要以为多几个database对象就可以了.
下面是一个例子:
/**
* 此方法在下面一个数据库方法内部调用
* 注意1 db不能close
* 2 cursor必须close
*/
private int quaryNoCloseDB(String imageName) {
int noticeCount = -1;
SQLiteDatabase db = helper.getReadableDatabase();
db.beginTransaction();
Cursor cursor;
try {
cursor = db.query(TABLENAME, new String[]{Constants.NOTICECOUNT}, Constants.IMAFENAME + "=?", new String[]{imageName}, null, null, null);
while (cursor.moveToNext()) {//遍历得到的所有行
....
}
db.setTransactionSuccessful();// 设置事务执行成功
} finally {
db.endTransaction();
}
if (noticeCount == -1) {
Log.i(TAG, "quary failed");
}
//db.close;//不能关闭
cursor.close();//必须关闭
return noticeCount;
}
/**
*此updata方法调用上面的方法
*
*/
public long updata(String imageName) {
SQLiteDatabase db = helper.getWritableDatabase();
db.beginTransaction();
long result = 0;
try {
int noticeCount = this.quaryNoCloseDB(imageName);//上述方法在这里调用
ContentValues value = new ContentValues();
value.put(Constants.NOTICECOUNT, noticeCount + 1);
result = db.update(TABLENAME, value, Constants.IMAFENAME + "=?", new String[]{imageName});
db.setTransactionSuccessful();// 设置事务执行成功
} finally {
db.endTransaction();
}
db.close();
if (result != 1) {
Log.i(TAG, "updata failed");
}
return result;
}
但是这只是遇到的一个例子 上述例子里只有要嵌套的方法放到第一句,即使正常的关闭db和cursor也不会异常.毕竟能绕过异常是最好的
http://blog.csdn.net/zhufuing/article/details/14455823