15

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

但是在我的一部 android 手机(htc g13)中,我在目录 /data/data/[package name]/databases 中找到了 *.db-wal 文件。并且使用 ContentProvider 操作时文件大小创建得非常快。它占用了太多的用户 RAM 空间。

建议在 post enter link description here中关闭 SQLiteOpenHelper 来解决我的问题(它很有用)。

但是我想找一个“地方”来添加“close()”方法,因为我没有直接使用 SQLiteOpenHelper(通过 ContentProvider 使用)。ContentProvider 中的 query() 方法必须返回一个 Cursor,并且 SQLiteDatabse 应该保持打开状态。

我很困惑,我现在做什么节目来保持 *.db-wal 消失并正常使用 ContentProvider?

4

2 回答 2

7

Android 框架工程师根据这个观点认为您需要关闭数据库。

根据此线程中的Dianne Hackborn(Android 框架工程师):

内容提供者在其托管进程创建时创建,并且只要进程存在就一直存在,因此无需关闭数据库 - 当内核清理进程资源时,它将关闭作为清理进程资源的一部分进程被杀死。

于 2013-08-08T18:36:13.157 回答
6

您有几个案例要涵盖:

1) 当您的应用程序完成时(例如输入 onDestroy()),确保关闭所有游标、SQLiteDatabase 和 SQLiteOpenHelpers 的数据库实例(使用模型 if (connection.isOpen()) object.close())

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

使用完数据库后立即关闭数据库是一种很好的做法。数据库已缓存,因此关闭它并在需要时使用 getWritableDatabase()/getReadableDatabase() 重新获取实例没有问题

来自官方文档: “一旦打开成功,数据库就会被缓存,因此每次需要写入数据库时​​都可以调用此方法。(请确保在不再需要数据库时调用close()。)”

还要记住,如果 SQLiteOpenHelper 缓存并跟踪所有打开的 SQLiteDatabase 实例,这基本上意味着如果您不保留打开的数据库连接,则不必在 SQLiteOpenHelper 上调用 close。

我建议在停止使用所有游标和数据库后立即关闭它们。始终尝试强制执行 try/catch/ 查询操作和“finally 块”来调用对象的关闭方法。

于 2011-12-16T09:18:31.787 回答