在多个Android活动之间共享sqlite数据库

时间:2009-10-12 21:03:54

标签: android sqlite

两个或多个Android活动可以打开一个sqlite3数据库进行写入吗?

我有两个活动需要将数据插入到同一个sqlite数据库中。当第二个Activity调用SQLiteOpenHelper.getWriteableDatabase()时,抛出IllegalStateException,并显示消息“ SQLiteDatabase已创建且从未关闭 ”。

我已经能够通过使我的数据库对象成为单例来避免异常,但我认为必须有更好的方法。

谢谢,

约翰

3 个答案:

答案 0 :(得分:14)

一次运行的活动永远不会超过一个。解决这个问题的简单方法是让第一个Activity在启动第二个Activity之前关闭它的连接。你可以在onPause()中执行此操作,然后在onResume()中重新打开它。像这样的东西(很伪的代码):

MyActivity {
    OnResume()
        open connection to database
    OnPause()
        close connection to database
}

这样您就不会尝试一次连接多个连接,并且连接始终可用。

答案 1 :(得分:2)

我还有多个活动,每个活动都会打开自己的数据库连接。当我开始其他活动时,我保持主Activity活着,当我不再需要它时,我在子活动上调用finish()。

我看到的是,当主Actitity仍在使用其DBAdapter时,子Activity可以成功打开连接并查询数据。当子Activity结束时,主Activity重新查询任何打开的游标。这似乎是自动发生的。

然而,在点击用户界面一段时间后,导致我的应用程序启动并完成活动,我最终会得到例外:

ERROR/Database(17657): Leak found
ERROR/Database(17657): java.lang.IllegalStateException:
      /data/data/yourpackage/databases/yourdatabase 
      SQLiteDatabase created and never closed
ERROR/Database(17657): at android.database.sqlite.SQLiteDatabase.<init>
     (SQLiteDatabase.java:1694)

异常不是来自当前位于前台的Activity,而是来自之前已完成的Activity。那么,会发生什么是垃圾收集器正在清理并找到开放的数据库连接。这不会影响应用程序 - 它继续正常工作,前台Activity的所有查询都返回数据。

解决方案只是关闭子Activity中的连接。 onDestroy()事件是正确的地方:

@Override    
protected void onDestroy() {        
    super.onDestroy();
    myAdapter.close();
}

因为我把它放在我所有的孩子活动中,所以我不再得到例外。

答案 2 :(得分:0)

我要做的是在超类中定义数据库,如果所有活动都扩展此类,则在AppCompatActivity中定义数据库,或者在活动类中定义它,该类是为所有活动继承的。