两个或多个Android活动可以打开一个sqlite3数据库进行写入吗?
我有两个活动需要将数据插入到同一个sqlite数据库中。当第二个Activity调用SQLiteOpenHelper.getWriteableDatabase()
时,抛出IllegalStateException,并显示消息“ SQLiteDatabase已创建且从未关闭 ”。
我已经能够通过使我的数据库对象成为单例来避免异常,但我认为必须有更好的方法。
谢谢,
约翰
答案 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中定义数据库,或者在活动类中定义它,该类是为所有活动继承的。