问题描述
|
我将以注视着我已经看过这个类似问题的笔记作为开头,但是我仍然遇到问题。基本上,我想在我的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()方法中,我在该Adapter上调用close方法(该适配器在我的适配器上调用close方法)。 SQLiteDatabase和我的SQLiteOpenHelper)。
我认为问题在于我在第二个活动中如何尝试重新打开数据库:
SQLiteDatabase db = openOrCreateDatabase(\"dog_data\",SQLiteDatabase.CREATE_IF_NECESSARY,null);
(我选择不使用包装器,因为我只需要在数据库上运行一个查询,也许这是一个问题)。
有人可以建议我的问题在哪里吗?我承认(可能从我的问题中可以清楚地看出),我不完全理解“关闭”数据库的含义(SQLiteDatabase.close()的文档不是特别具体)。我的问题的主要原因。
谢谢。
解决方法
万一有人碰巧遇到类似问题(似乎可能,但可能不太可能),我最近偶然发现了解决方案。在我的\“ DbAdapter \”的insert方法中,我(愚蠢地)通过查询来查询其中一个字段具有给定值的行的唯一性,并查看该查询是否返回了任何行。这是在创建一个我没有关闭的游标,导致了上面提到的“最终定标”错误。
, 我之前已收到该错误,因此不得不使用cursor.close()来更正此问题。我不确定为什么,因为有时候我没有使用close()并且没有收到错误。也许这是一条警告,只有当它停在表演停止错误旁边时才会被注意到吗?
我会说正确的过程是打开数据库连接->通过运行db方法创建游标->通过游标进行迭代->关闭游标->关闭数据库连接。