具有多线程的Android SQLite数据库

时间:2012-10-12 13:46:10

标签: android android-sqlite

我正在开发一个必须使用多线程的应用程序。在我的应用程序中,我有一个 SQLiteOpenHelper 类的单个实例,我有打开关闭的方法数据库以及插入获取数据的一些方法。

现在我的问题是,我在第一个线程中打开数据库并同时启动事务第二个线程也获取打开的数据库对象并启动事务。

第一个主题完成其流程,关闭另一方的数据库第二个主题正在运行,第二个主题获取数据库已关闭

有些合乎逻辑的问题请有人帮我解决这个问题我如何以正确的方式处理关闭数据库。

提前致谢

2 个答案:

答案 0 :(得分:3)

  

我的应用程序中有一个SQLiteOpenHelper类的实例,我有打开和关闭数据库的方法以及一些插入和获取数据的方法。

只有在完成数据库完成后才应关闭数据库,例如创建这些线程的活动或服务被销毁时。

仅仅从不关闭数据库也不是不可能的。如果实现ContentProvider,则永远不会关闭数据库。虽然这可能会导致LogCat中有关泄漏打开的数据库句柄的警告,但SQLite的事务性质意味着无法关闭数据库不会导致任何特定问题(例如,无法刷新缓冲区)。

答案 1 :(得分:0)

通常情况下,我会保持SQLLite Android DB在应用程序结束时打开并关闭它,但这并不会消除最初的问题。

我发现当数据库没有正确关闭时,可能会在Android上打开问题,所以简单的从不关闭数据库似乎对我不起作用。

我将所有操作包装在事务和异常处理程序块中。

请注意,所有事务都需要在关闭数据库时完成,因此close方法等待事务完成(我还有事务计数器)。

这是一个示例try catch事务块,我将所有数据库操作包装在:

SQLPersistentStore扩展了SQLiteOpenHelper getPersistentStore(){在DB关闭时返回null} ..

void public operation(..){

   SQLPersistentStore persistentStore = null;

    try {
            persistentStore = getPersistentStore();
            persistentStore.beginTransaction();

        ... do the DB operations

        persistentStore.setTransactionSuccessful();

    } catch ( IllegalStateException e) {
        ... 
        Log.w(...
    } catch (Exception e) {
        Log.e(TAG, ...
            throw new RuntimeException(e);
    } finally {
        if(persistentStore != null){
            persistentStore.endTransaction();
        }
    }

关闭数据库并尝试对其进行操作时,会出现IllegalStateException,并且会被捕获。