Android关于attempt to re-open an already-closed object: SQLiteDatabase: /data/data/

产生原因:
在一个数据库增删改查方法中调用了另一个数据库查询方法,注意:每个线程只能使用一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值