在一个线程上关闭SQLite数据库会破坏在另一个线程上打开的数据库

时间:2011-02-10 11:22:35

标签: android multithreading sqlite

我们都learn应该尽早获取资源(例如数据库连接)并尽早发布。

然而,将此原则应用于Android上的SQLite数据库连接已经让我感到头痛。

我有一个应用程序,它从后台服务器的后端服务器下载更新,并定期向数据库写入更新。当出现以下序列时,我遇到的问题出现了:

  1. 服务打开可写数据库连接
  2. 某些活动会打开可读的数据库连接
  3. 服务使用活动读取数据
  4. 关闭其数据库连接并发
  5. 由于数据库连接已关闭,活动失败
  6. 服务和活动都使用相同的SQLiteOpenHelper类(尽管是不同的实例)来打开它们的连接。我最初的假设是,这应该可以正常工作,但不知何故,似乎底层连接在两个数据库实例之间共享。

    要解决这个问题,我最终没有关闭数据库对象,只关闭任何打开的游标。这似乎有效,但我不确定我是不是在这里泄漏记忆。

    这里有什么显而易见的东西吗?

1 个答案:

答案 0 :(得分:1)

  

这里有什么显而易见的东西吗?

我会说不。查看SQLiteOpenHelper的源代码,我看不出两个实例如何共享SQLiteDatabase对象。

一些诊断建议:

  • 转储每个toString()的{​​{1}}值,它应该为您提供Java实例ID。如果它们是相同的,那就是你的问题所在,你将需要按照上游的方式去弄清楚这是怎么回事(例如,你真的使用SQLiteDatabase的相同实例)。
  • 当您的数据库处于稳定状态(即无需创建或升级)时,请翻转两个数据库中的一个以直接使用SQLiteOpenHelper,而不是通过SQLiteDatabase,并查看是否变化很重要。