问题 Android中的数据库访问


我正在创建一个Android应用程序,基本上是关于蘑菇的信息列表。我从sqlite数据库中获取此信息。我有一个全局单例,里面有一个服务类,我用它来访问我的数据库。几乎每个活动都访问数据库。最好是让我的数据库一直打开,还是打开并关闭它,因为我需要数据?

如果最佳做法是始终保持打开状态,那么我需要确保关闭它,如果我在活动被销毁时将其保持打开状态,最糟糕的情况是什么?


5183
2017-08-02 20:18


起源



答案:


基于我过去在Java中的经验,我会说最好关闭连接,它可能在一个小型Android应用程序中无关紧要,但如果你有10个应用程序正在运行并且所有应用程序都访问数据库,那么你有10个挂起的连接。再开始一些,迟早另一个应用程序将不得不等待,因为SQL服务器无法处理更多请求。

我想你可以把它想象成你电脑上的文件。您从中读取数据,然后在完成后关闭它。为什么要在应用程序中打开文件?

现在我对Android编程很新,所以我还没有实现数据库调用。但是几年前,当我在Java应用程序中遇到同样的问题时,我实现了一个数据库对象,我在其中连接到数据库。 “其他人”(类)必须调用数据库对象(单例或最终方法)来获取数据,有点像存储过程,但在应用程序中。

因此,我知道何时拨打电话以及何时停止。然后我进入超时状态,好像几分钟内什么也没发生,我会关闭与数据库的连接。 (这也处理了一些超时异常,因为连接的超时永远不会发生。)当输入新的呼叫时,我可以轻松地启动新连接并使用新的数据库连接。

基本上我通过使用方法来抽象SQL调用 public Fungus[] getAllFungus() 和 public Fungus[] getFilteredFungus(string where)


0
2017-08-10 08:16



如果您在Android中实现数据库,那么您应该使用它 SQLiteOpenHelper 或者a ContentProvider 管理你的连接。然后你就可以回来了 Cursor 这使您可以迭代结果集,或者非常容易地将其放在列表中。 - Austyn Mahoney


答案:


基于我过去在Java中的经验,我会说最好关闭连接,它可能在一个小型Android应用程序中无关紧要,但如果你有10个应用程序正在运行并且所有应用程序都访问数据库,那么你有10个挂起的连接。再开始一些,迟早另一个应用程序将不得不等待,因为SQL服务器无法处理更多请求。

我想你可以把它想象成你电脑上的文件。您从中读取数据,然后在完成后关闭它。为什么要在应用程序中打开文件?

现在我对Android编程很新,所以我还没有实现数据库调用。但是几年前,当我在Java应用程序中遇到同样的问题时,我实现了一个数据库对象,我在其中连接到数据库。 “其他人”(类)必须调用数据库对象(单例或最终方法)来获取数据,有点像存储过程,但在应用程序中。

因此,我知道何时拨打电话以及何时停止。然后我进入超时状态,好像几分钟内什么也没发生,我会关闭与数据库的连接。 (这也处理了一些超时异常,因为连接的超时永远不会发生。)当输入新的呼叫时,我可以轻松地启动新连接并使用新的数据库连接。

基本上我通过使用方法来抽象SQL调用 public Fungus[] getAllFungus() 和 public Fungus[] getFilteredFungus(string where)


0
2017-08-10 08:16



如果您在Android中实现数据库,那么您应该使用它 SQLiteOpenHelper 或者a ContentProvider 管理你的连接。然后你就可以回来了 Cursor 这使您可以迭代结果集,或者非常容易地将其放在列表中。 - Austyn Mahoney


这里最好的选择是重构,以便您的应用程序通过ContentProvider访问数据库。您的ContentProvider实现是唯一具有数据库打开句柄的实现。

这为您提供了几个优势:

  • 只有一件事打开数据库,所以你的问题就消失了。
  • 许多标准支持类可以自动化数据库管理等内容。
  • 更好地与标准的Android列表管理视图集成,这些视图都设计为使用ContentProviders提供的游标自动运行。
  • 所有数据都可以通过URI(通常格式为'content://com.fnord.mushroom/mushroom/43')来处理,这意味着其他应用程序也可以访问您的数据。

使用ContentProvider,可以将三个或四个标准类粘合在一起,以生成数据库的浏览器接口,从而实际上不必编写任何真实的逻辑。

从消极方面来说,ContentProviders只支持通过有限的接口进行访问 - 在SQL术语中,您可以获得INSERT,SELECT,UPDATE和DELETE而不使用嵌套子句。如果您正在执行复杂的SQL操作,将请求从您的应用程序路由到ContentProvider并再次返回可能会有点痛苦。但是,大多数人不需要这样做(如果你这样做,自定义意图是要走的路)。


10
2017-08-06 11:23





我会根据需要打开数据库。这样,一旦打开它的特定活动完成,您就确定连接已关闭。尽管Android已内置检查以确保在应用程序终止时关闭,但安全方面并不会造成伤害。我也猜测它一直打开可能会导致泄漏或其他什么。


1
2017-08-02 20:31



好吧,我打开数据库,使用它,然后在我完成后立即关闭。当我开始另一个活动时,我再次打开onResume并关闭onPause(和onDestroy)。新活动的行为相同。当我销毁当前活动并返回到上一个屏幕时,我的适配器尝试在调用onResume之前重新连接到db,并且我得到了关于“fillWindow”的异常。 - Dale Marshall
好吧为了避免在调用getWritable之前的fillWindow异常,在你的dboject处理程序对象上调用close,它可能会关闭onFinish或onStop。 - success_anil
你说你关闭它onDestroy。在不同活动的onResume之后调用onDestroy是可能的。这将导致您的全局数据库关闭您不希望它的内容:) - Moncader