在我的Android应用程序中,我使用SQLiteOpenHelper来实现ContentProvider。 查询,添加,删除操作都是通过ContentProvider。
但是在我的一部Android手机(htc g13)中,我在目录/ data / data / [package name] / databases中找到了* .db-wal文件。使用ContentProvider进行操作时,文件大小会非常快。它占用用户RAM空间太多了。
建议关闭SQLiteOpenHelper以在帖子enter link description here中解决我的问题(这很有用)。
但我希望找到一个“地方”来添加“close()”方法,因为我没有直接使用SQLiteOpenHelper(通过ContentProvider使用)。 ContentProvider中的query()方法必须返回一个Cursor,而SQLiteDatabse应保持打开状态。
我很困惑,我现在要做什么让* .db-wal消失并正常使用ContentProvider?
答案 0 :(得分:6)
Android框架工程师请遵循此视图,您需要关闭数据库。
根据Dianne Hackborn(Android框架工程师)in this thread:
在创建托管进程时创建内容提供程序,并且 只要这个过程一直存在,所以没有必要 关闭数据库 - 它将作为内核的一部分关闭 在进程被杀死时清理进程的资源。
答案 1 :(得分:5)
您需要处理几个案例:
1)当您的应用程序完成时(例如输入onDestroy()),请确保关闭所有游标,SQLiteDatabase的数据库实例和SQLiteOpenHelpers(使用模型if(connection.isOpen())object.close())
2)当你的应用程序继续onPause() - > onResume() - 适当地使用此阶段来暂停/恢复连接或关闭/打开它们。
最好在使用完毕后立即关闭数据库。数据库已缓存,因此关闭它并在需要时使用getWritableDatabase()/ getReadableDatabase()再次重新获取实例时没有问题
来自官方文件: “成功打开后,数据库会被缓存,因此每次需要写入数据库时都可以调用此方法。(确保在不再需要数据库时调用close()。”“
还要记住,如果SQLiteOpenHelper缓存并跟踪SQLiteDatabase的所有打开实例,它基本上意味着如果不保留开放数据库连接,则不必在SQLiteOpenHelper上调用close。
我建议您在停止使用它们后立即关闭所有游标和数据库。总是尝试强制执行try / catch /查询操作,并尝试“finally块”来调用对象上的close方法。