两个或多个Android活动可以同时打开一个sqlite3数据库进行写入吗?
我有两个需要向同一个sqlite数据库插入数据的活动。当第二个活动调用SQLiteOpenHelper.getWriteableDatabase()
时,会抛出一个IllegalStateException,其中包含消息“SQLiteDatabase created and never closed”。
通过将我的数据库对象设置为单例,我已经能够避免异常,但我认为一定有更好的方法。
谢谢,
John
两个或多个Android活动可以同时打开一个sqlite3数据库进行写入吗?
我有两个需要向同一个sqlite数据库插入数据的活动。当第二个活动调用SQLiteOpenHelper.getWriteableDatabase()
时,会抛出一个IllegalStateException,其中包含消息“SQLiteDatabase created and never closed”。
通过将我的数据库对象设置为单例,我已经能够避免异常,但我认为一定有更好的方法。
谢谢,
John
在任何时候实际上都不会有超过一个Activity正在运行。解决这个问题的简单方法是在启动第二个Activity之前,第一个Activity关闭它的连接。您可以在onPause()中执行此操作,然后在onResume()中重新打开它。类似这样(非常伪代码):
MyActivity {
OnResume()
open connection to database
OnPause()
close connection to database
}
这种方式可以确保您不会同时尝试建立多个连接,并且连接始终可用。
我有多个Activity,每个Activity都会打开自己的数据库连接。在启动其他活动时,我会保持主Activity处于活动状态,并在不再需要它们时调用子活动的finish()方法。
我发现一个问题:当主Activity仍然持有它的DBAdapter时,子Activity可以成功打开连接并查询数据。当子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)
@Override
protected void onDestroy() {
super.onDestroy();
myAdapter.close();
}
自从我在所有子活动中添加了这个代码,我就不再遇到异常了。