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

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

我有两个活动,需要插入数据到同一个SQLite数据库。 当第二个Activity调用SQLiteOpenHelper.getWriteableDatabase() ,会抛出一个IllegalStateException,并显示消息“ SQLiteDatabase created and never closed ”。

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

谢谢,

约翰

Solutions Collecting From Web of "在多个Android活动之间共享sqlite数据库"

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

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

这样,你永远不会试图一次有多个连接,连接总是可用的。

我也有多个活动,每个活动打开自己的数据库连接。 当我开始其他活动的时候,我把主活动保持在活动状态,而当我不再需要活动的时候,我把这个活动叫做finish()。

我所看到的是一个子Activity可以成功地打开一个连接并查询数据,而主Actitity仍然保存在它的DBAdapter中。 当子Activity结束时,主Activity将重新打开任何已打开的游标。 这似乎是自动发生的。

但是,在用户界面上点击一下,导致我的应用程序启动并完成活动后,我最终会得到exception:

 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) 

这个例外不是来自当前处于前台的活动,而是来自前一个完成的活动。 所以,垃圾收集器正在清理并find打开的数据库连接。 这不会影响应用程序 – 它继续正常工作,并从前台的所有查询活动返回数据。

解决方法是简单地closures子Activity中的连接。 onDestroy()事件是正确的地方:

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

由于我把这个放在我所有的孩子活动中,我不再有这个例外。