csh_34 2013-08-06 07:01 采纳率: 0%
浏览 9910

打开和关闭SQLite数据库

我开发了一个android程序,经常用来访问本地数据库。这个数据库可以从不同的线程中访问,所以对于数据库有一个协调问题,我用的是open() 和 close() 方法。

public void open(){ 
    mDb=mDbHelper.getWritableDatabase();
}

public void close(){
        mDb.close();
}

所以通常当我需要访问数据库执行操作时,就打开数据库,然后执行一些操作,最后关闭数据库。使用的代码如下:

 try {
        dbManager.open();
                    // database operation
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }finally{
        try {
            dbManager.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

但是,如果这段代码从不同的线程中使用(假使线程 A 和线程B),就会发生下面的情况:

A thread: performs open()
B thread: perfroms open()
A thread: perfroms some operation
A thread: performs close()
B thread: try to perform some operation but it fails!

因此,唯一的解决方法是当程序开启时执行open(),程序停止是执行close()。我不知道这是不是一个好的解决方法?
实际上,getWritableDatabase() 方法(从open()中调用)的文档也说:

Make sure to call close() when you no longer need the database

谁能告诉我一个可执行的解决方案?

  • 写回答

1条回答

  • oyljerry 2015-01-03 06:40
    关注

    换新版本sqlite,看是否支持多线程并发访问

    评论

报告相同问题?

悬赏问题

  • ¥15 求差集那个函数有问题,有无佬可以解决
  • ¥15 MATLAB动图问题
  • ¥15 【提问】基于Invest的水源涵养
  • ¥20 微信网友居然可以通过vx号找到我绑的手机号
  • ¥15 寻一个支付宝扫码远程授权登录的软件助手app
  • ¥15 解riccati方程组
  • ¥15 display:none;样式在嵌套结构中的已设置了display样式的元素上不起作用?
  • ¥15 使用rabbitMQ 消息队列作为url源进行多线程爬取时,总有几个url没有处理的问题。
  • ¥15 Ubuntu在安装序列比对软件STAR时出现报错如何解决
  • ¥50 树莓派安卓APK系统签名