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

  • 回答 (2)
  • 关注 (0)
  • 查看 (19)

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

我有两个活动需要将数据插入到同一个sqite数据库中。当第二个活动调用SQLiteOpenHelper.getWriteableDatabase()抛出一个IllegalStateException与消息“创建并从未关闭的SQLiteDatabase

我已经能够避免异常,使我的数据库对象是一个单例,但我认为一定有更好的方法。

谢谢

啊偶我去Skype啊偶我去Skype提问于
你想要的cccJava/Python/IOS爱好者,骑行+跑步。。。哦,对了,还养了两只猫。回答于
已采纳

一次只有一个活动在运行。解决这个问题的简单方法是在启动第二个活动之前让第一个活动关闭它的连接。可以在onPace()中这样做,然后在onResume()中重新打开它。类似的东西(非常的psuedo代码):

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

这样,一次就不会尝试拥有一个以上的连接,并且连接总是可用的。

笔洁7eProgrammer回答于

我也有多个活动,每个活动都打开自己的数据库连接。在开始其他活动时,我会保持主活动的活力,并且当我不再需要子活动时,我会对它们调用Finish()。

我看到的是,一个子活动可以成功地打开连接和查询数据,而主Actity仍然保留它的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)

异常不是来自当前处于前台的活动,而是来自一段时间前完成的活动。因此,垃圾收集器正在清理并找到打开的数据库连接。这不影响应用程序-它继续工作良好,所有查询从前台活动返回数据。

解决方案只是关闭子活动中的连接。onDesty()事件是正确的位置:

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

既然我把这个放在我所有的孩子活动中,我就不再例外了。

扫码关注云+社区