永远不要关闭 Android SQLite 连接

Posted

技术标签:

【中文标题】永远不要关闭 Android SQLite 连接【英文标题】:Never close Android SQLite connection 【发布时间】:2011-11-04 22:21:47 【问题描述】:

如果您从不关闭连接会发生什么?我知道如果您不关闭它并尝试打开另一个异常,您会遇到异常,但是如果您有一个全局单例,并且您根本不关闭它会发生什么?有什么想法吗?

【问题讨论】:

【参考方案1】:

时空连续体中形成裂痕,威胁着宇宙中所有生命的灭绝,直到这一天被一群穿着鲜艳有趣的服装(包括一些披着披风,如果你能相信的话)。

哦,不,等等。那只是一本漫画书。


实际上,没有什么大事发生。 Google 员工和其他 android 专家告诉我,由于 SQLite 的工作方式(特别是它对事务的处理),如果您未能关闭数据库,应该不会发生任何坏事。

事实上,如果你实现了一个内容提供者,你会得到同样的效果,因为内容提供者不会被任何onDestroy() 方法调用,这意味着你永远没有机会关闭你的数据库。内容提供者将一直存在,直到进程终止。就我个人而言,这真的让我很烦恼,这也是我尽量减少使用内容提供程序的原因之一。

【讨论】:

内容提供者是 Android 中最不被理解和被过度使用的部分之一。它们在文档中被大量推送,或者至少在早期文档中被大量推送,但仅当您计划与 3rd 方应用程序共享数据时才应使用它们。我见过人们使用它们只是为了序列化数据库访问,这很糟糕。无论如何,我认为有一个静态连接会很好。我做了很多工作来测试多个连接会发生什么。总结,不好:touchlab.co/blog/android-sqlite-locking。为 ORMLite 重新进行连接管理。谢谢。 这是一篇很棒的博文,顺便说一句。 @John 也在这里...我认为它们是相同的虽然touchlabblog.tumblr.com/post/24474398246/android-sqlite-locking @dimsuz:“如果我有一个始终打开的连接,它不会以某种方式消耗内存吗?” - 不多。 “或者内存只被游标消耗并在我关闭它们时释放”——一般来说,是的。 @dimsuz 同意 CommonsWare。我没有很多硬数据,但调试了许多应用程序以解决内存问题。事实上,今天正在这样做。这从来都不是问题。一般来说,内存问题==位图。但是,SQLITE 是用 C 代码实现的,所以内存分配可能不是很明显。有趣的话题。

以上是关于永远不要关闭 Android SQLite 连接的主要内容,如果未能解决你的问题,请参考以下文章

Android - 关闭数据库后可以使用 SQLite 光标吗?

我们可以在 Android 中使用 SQLite 数据库上的所有 SQL 查询和函数吗? [关闭]

MySQL注入

Android SQLite 示例 [关闭]

Android Studio Adb 连接报错:一个现有连接被远程主机强行关闭

SQLite-WinRT 包装器中的关闭连接