【问题标题】:Android when should I be opening and closing db connections?Android 什么时候应该打开和关闭数据库连接?
【发布时间】:2012-04-13 04:19:31
【问题描述】:

概述:在 onStart 和异步任务中打开数据库连接变得相当复杂。拥有全局可用的数据库连接是不好的做法吗?如果不好,有什么更好的方法?

详细信息:我有一个应用程序在几个活动中连接到 sqlite3 数据库。起初,我需要访问数据库的地方并不多,所以我只是在每次需要访问时打开和关闭。然后还有更多地方需要访问它,因此,正如另一个 Stack Overflow 问题所建议的那样,我开始在需要连接的活动的 onStart 方法中打开数据库连接,并在 onStop 方法中关闭它。

这一直很好,直到我开始在一些超过活动的异步任务中需要连接。由于活动的 onStop 方法已被调用并且连接已关闭,当异步任务尝试访问数据库时,它已失败。作为一种解决方案,我为在 onPreExecute 方法中打开并在 onPostExecute 方法中关闭的每个异步任务创建了单独的连接。

这导致了很多连接的打开和关闭,我想知道在应用程序上下文中创建全局可用的数据库连接是否是个好主意。如果我忘记关闭连接或应用程序遇到强制关闭,它肯定会清理大量代码并删除正在发生的任何未关闭的数据库异常。其他人尝试过这个/看到这种方法有什么问题吗?

【问题讨论】:

  • 这是一个好习惯,去做吧。要避免的主要问题是使用应用程序上下文的内存泄漏,如果它只是用于数据库操作,这应该不是问题。

标签: android database database-connection


【解决方案1】:

几周前我遇到了类似的问题。我使用了几个在 SQLite 数据库中具有持久性的类。

由于我想将活动与持久性分离,我为那些需要持久性的人创建了静态内部类(称为管理器)。每次我实例化一个管理器时,都会创建一个数据库连接,并在使用管理器后显式关闭它。如果我有全局管理器来访问表,它们应该由于并发而同步,我不知道什么时候应该关闭这些数据库连接。所以我就这样做了。

希望这会有所帮助!

【讨论】:

  • 谢谢,没有考虑并发问题,这正是我要找的。​​span>
【解决方案2】:

您可以创建一个 BaseAsyncTask,其 onPreExecute() 和 onPostExecute() 负责打开和关闭数据库连接。

AsyncTasks 可以扩展 BaseAsyncTask 调用 super.onPreExecute() 和 super.onPostExecute() 并在 doInBackground() 方法中执行数据的实际加载。

【讨论】:

  • 不得不接受另一个答案,因为它更好地回答了我的问题,但我肯定也会这样做。谢谢!
猜你喜欢
  • 2012-02-28
  • 1970-01-01
  • 2018-05-08
  • 2013-12-27
  • 2015-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多