在Android的连续活动中使用相同的数据库,没有内存泄漏

时间:2011-05-27 16:43:57

标签: android sqlite cursor

我会在这个问题前面加注this similar question,但我仍然遇到问题。基本上,我想在我的Android应用程序中的两个活动中访问同一个数据库。但是,当我在第二个活动中打开它时,我在LogCat中收到了两个系列的消息:

第一:

  

“终结者抛出未捕获的异常(将被丢弃):
  Ljava / lang / IllegalStateException;:在未停用或关闭的狗上完成游标android.database.sqlite.SQLiteCursor@436053b8   在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)“

(dogs是我数据库中表格的名称dog_data)

第二:

  

“错误/数据库(1316):泄漏发现了   错误/数据库(1316):java.lang.IllegalStateException:/data/data/com..../databases/dog_data SQLiteDatabase已创建且从未关闭“

据我所知,我在退出第一个活动时关闭我的数据库。按照记事本教程的风格,我的SQLiteDatabase周围有一个包装类“DbAdapter”,在第一个活动的onPause()方法中,我在该适配器上调用close方法(它调用我的SQLiteDatabase上的close方法,我的SQLiteOpenHelper)。

我认为问题是我在第二次活动中尝试重新打开数据库:

SQLiteDatabase db = openOrCreateDatabase("dog_data", 
    SQLiteDatabase.CREATE_IF_NECESSARY, null);

(我选择不使用包装器,因为我只需要在数据库上运行一个查询,这可能是一个问题)。

有人可以告知我的问题可能在哪里吗?我承认(从我的问题可能很清楚)我不完全理解“关闭”数据库的含义(SQLiteDatabase.close()的文档并不特别具体),这可能是我的主要原因。我的问题。

感谢。

2 个答案:

答案 0 :(得分:1)

万一有人碰巧遇到类似问题(似乎可能但可能不太可能),我最近偶然发现了解决方案。在我的“DbAdapter”的插入方法中,我(愚蠢地)通过查询具有给定值的行来检查其中一个字段的唯一性,并查看该查询是否返回任何行。这是创建一个我没有关闭的游标,导致上面提到的“Finalizing游标”错误。

答案 1 :(得分:0)

之前我收到过该错误,必须使用cursor.close()来解决问题。我不确定为什么,因为有时我没有使用close()并且没有收到任何错误。也许这是一个警告,只有当它坐在停止错误旁边才会被注意到?

我会说正确的程序是开放的数据库连接 - >通过运行db方法创建游标 - >迭代光标 - >关闭光标 - >关闭数据库连接。