2011-05-27 15 views
1

我将在前面提到这个问题,注意我已经看过this similar question,但是我仍然遇到问题。基本上,我想在我的Android应用程序的两个活动中访问同一个数据库。然而,当我在第二个活动打开它,我得到两个系列的消息在我的logcat:在没有内存泄漏的情况下在Android中的连续活动中使用相同的数据库

第一:

“的终结抛出未捕获的异常(将被丢弃):
Ljava /郎/ IllegalStateException异常;:结束写入光标[email protected]上还没有被去激活或在android.database.sqlite.SQLiteCursor.finalize(SQLiteCursor.java:596)关闭

(狗是在我的数据库表的名称,dog_data)

二:

“ERROR /数据库(1316):泄漏发现
ERROR /数据库(1316):java.lang.IllegalStateException:/数据/数据/ COM ... /数据库/ dog_data SQLiteDatabase创建和从未关闭”

至于我可以告诉大家,我上午在退出的第一个活动结束我的数据库。遵循记事本教程的风格,我在SQLiteDatabase和第一个活动的onPause()方法中有一个包装类“DbAdapter”,我调用该Adapter上的close方法(它调用SQLiteDatabase上的close方法,以及我的SQLiteOpenHelper)。

我认为这个问题是我如何我试图重新打开数据库在我的第二个活动:

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

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

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

谢谢。

+0

事实上,事实证明,我在打开和关闭数据库时有点过于热情。通过从onResume()和DbAdapter.open()从onResume()中删除DbAdapter.close(),我能够停止内存泄漏。 我仍然得到第一个“终结光标”问题,虽然它在LogCat中是绿色字体,似乎表明它不是一个大错误。如果可能的话,我仍然想解决它。预先感谢您的帮助。 – 2011-05-27 17:00:47

回答

1

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

0

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

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

+0

感谢您的帮助。正如我在上面的评论中指出的,我能够修复内存泄漏。光标问题对我来说仍然没有解决,但据我所知,这并不是特别重要,所以我继续前进。我早些时候关闭了游标,并且我还尝试在我创建的每个游标上调用startManagingCursor() - 在停止最终化游标illegalstateexception时没有运气。 – 2011-05-31 23:13:56

相关问题