Android:打开和关闭SQLite数据库

3

我正在开发一款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
不要关闭数据库,只需关闭指向该数据的游标。 - umesh
仅在一个线程上同步访问或执行数据库操作。 - MaciejGórski
...或者构建ContentProvider... - Selvin
2个回答

2

您可以使用单例实例,通常情况下,您可以不关闭数据库(但保持事务处于关闭状态)。以下是一些信息:

Android SQLite DB何时关闭


1
创建一个包装类,添加一个原子整数成员。每次打开数据库时,增加该成员;关闭数据库时,减少该成员。如果该成员为零,则实际关闭数据库。

1
不,你将拥有一个原子整数来知道何时真正关闭数据库,并在包装器上调用close,在包装器内部,仅当该整数为0时,您才会实际关闭数据库。 - Buda Gavril

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接