两个或更多的Android活动可以打开sqlite3数据库进行写操作吗?
我有两个活动需要将数据插入到同一个sqlite数据库中。当第二个活动调用SQLiteOpenHelper.getWriteableDatabase()
时,会抛出一个IllegalStateException,并显示消息"SQLiteDatabase created and never closed“。
我已经能够通过使我的数据库对象成为单例来避免异常,但我在想一定有更好的方法。
谢谢,
约翰
发布于 2009-10-12 23:19:08
实际上,一次运行的活动永远不会超过一个。解决这个问题的简单方法是让第一个活动在启动第二个活动之前关闭它的连接。您可以在onPause()中执行此操作,然后在onResume()中重新打开它。如下所示(非常psuedo-code):
MyActivity {
OnResume()
open connection to database
OnPause()
close connection to database
}
通过这种方式,您永远不会尝试一次拥有多个连接,并且该连接始终可用。
发布于 2010-07-01 09:48:56
我还有多个活动,每个活动都打开自己的数据库连接。当我启动其他活动时,我会保持主活动处于活动状态,并且当我不再需要子活动时,我会对子活动调用finish()。
我所看到的是,子活动可以成功地打开连接并查询数据,而主活动仍然持有它的DBAdapter。当子活动结束时,主活动将重新查询所有打开的游标。这似乎是自动发生的。
然而,在用户界面上单击了一段时间后,我的应用程序开始和结束活动,我最终会得到一个异常:
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)
异常不是来自当前在前台的活动,而是来自不久前完成的活动。因此,垃圾收集器正在清理并找到打开的数据库连接。这不会影响应用程序-它继续正常工作,并且来自前台活动的所有查询都会返回数据。
解决方案只是关闭子活动中的连接。onDestroy()事件是执行此操作的正确位置:
@Override
protected void onDestroy() {
super.onDestroy();
myAdapter.close();
}
因为我把它放在我所有的孩子活动中,我不再得到异常。
发布于 2018-01-29 21:37:35
我要做的是在一个超类中定义数据库,如果所有的活动都扩展了这个类,那么这个超类就是AppCompatActivity,或者在所有活动继承的Activity类中定义它。
https://stackoverflow.com/questions/1556930
复制相似问题