什么时候应该调用close()对ContentProvider的使用SQLiteOpenHelper

问题描述 投票:14回答:2

在我的Android应用程序,我使用SQLiteOpenHelper来实现的ContentProvider。查询,添加,删除等操作都是通过ContentProvider的。

但是,在我的Android手机(HTC G13)中的一个,我发现*在目录/数据/数据/ [包名称] .db的,沃尔玛的文件/数据库。且文件大小increate非常快的ContentProvider操作时。它占领用户的RAM空间太多了。

建议关闭SQLiteOpenHelper解决我的问题(这是很有用)在岗enter link description here

但我想找到一个“地方”添加“关闭()”方法,因为我并没有直接使用SQLiteOpenHelper(通过使用ContentProvider的)。在ContentProvider的query()方法必须返回一个指针,而SQLiteDatabse应留在打开状态。

我很困惑,我现在做的,让何秀* .db的,威名远扬,并正常使用的ContentProvider?

android android-contentprovider sqliteopenhelper
2个回答
7
投票

Android框架工程师推迟这个观点,你需要关闭DB。

按照戴安娜Hackborn(Android框架工程师)in this thread

创建它的宿主进程,当内容提供商创建,并保持周围,只要过程做,所以没有必要关闭数据库 - 它会被封闭,清理过程中的资源时,内核的一部分进程被杀死。


5
投票

你有一对夫妇的情况下盖的:

1)当你的应用程序结束(例如进入的onDestroy()),请确保您关闭所有游标,SQLiteDatabase的数据库实例和SQLiteOpenHelpers(使用模型,如果(connection.isOpen())object.close())

2)当你应用程序进入的onPause() - >的onResume() - 使用此阶段适当地暂停/恢复您的网络连接或关闭/打开它们。

这是一个很好的做法,关闭数据库使用完它的工作之后。该数据库缓存,所以没有问题,将其关闭并重新获得例如当你与getWritableDatabase()/ getReadableDatabase()需要它

从官方文档:“一旦成功打开,数据库缓存,所以您可以在每次需要写入到数据库时调用此方法(请确保调用close()时,你不再需要数据库。)。”

还要记住,如果SQLiteOpenHelper缓存和跟踪SQLiteDatabase的所有打开的情况下,基本上意味着,如果你不离开打开的数据库连接,你会不会对SQLiteOpenHelper千钧一发。

我建议关闭所有光标和数据库,你停止与他们合作之后。总是试图强制执行的try / catch /进行查询操作和一个“finally块”来调用对象的close方法。

© www.soinside.com 2019 - 2024. All rights reserved.