2010-08-02 60 views
11

我正在创建基本上是蘑菇上的信息列表的Android应用程序。我从sqlite数据库中获取这些信息。我有一个全球单身人士,里面有一个服务类,我用它来访问我的数据库。几乎每个活动都访问数据库。随着我需要数据,将我的db始终打开还是打开并关闭它会更好?Android中的数据库访问

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

回答

0

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

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

现在我对Android编程非常陌生,所以我还没有完成数据库调用。但是,几年前,当我在Java应用程序中遇到同样的问题时,我实现了一个数据库对象,在该数据库对象中我连接了数据库。 “其他人”(类)不得不调用数据库对象(singleton或final方法)来获取数据,而不是像存储过程那样,而是在应用程序中。

正因为如此,我知道什么时候发生的呼叫以及何时停止。然后我进入超时状态,好像几分钟内没有任何事情发生,我将关闭与db的连接。 (这也处理了一些超时异常,因为连接的超时不会发生。)当一个新的调用进入时,我可以很容易地启动一个新的连接并使用新的数据库连接。

基本上,我通过方法public Fungus[] getAllFungus()public Fungus[] getFilteredFungus(string where)抽象出SQL调用。

+0

如果你在Android中实现一个数据库,你应该使用'SQLiteOpenHelper'或者'ContentProvider'来管理你的连接。然后你可以返回'Cursor',它可以让你遍历结果集,或者很容易地将它放在列表中。 – 2011-02-03 18:45:09

1

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

+0

嗯,我打开数据库,使用它,然后关闭,一旦我完成。当我开始另一项活动时,我再次打开onResume并关闭onPause(和onDestroy)。新活动的行为相同。当我销毁当前活动并返回到前一个屏幕时,我的适配器会在调用onResume之前尝试重新连接到数据库,并且我得到异常'有关fillWindow的一些事情'。 – 2010-08-03 02:47:52

+0

嗯 要在调用getWritable之前避免fillWindow异常您的dboject处理程序对象上的数据库调用关闭它可能会关闭onFinish或onStop。 – 2010-08-05 11:22:27

+0

你说你把它关闭onDestroy。 onDestroy可能会在不同活动的onResume之后被调用。这将导致你的全局数据库关闭一些你不想要的东西:) – Moncader 2010-08-06 05:23:02

10

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

这给你几个优点:

  • 只有一两件事,有数据库开放的,所以你的问题只是消失。
  • 大量的标准支持类来自动化数据库管理等内容。
  • 与标准Android列表管理视图更好地集成,这些视图全都设计为可以使用ContentProviders提供的光标自动工作。
  • 您的所有数据都可以通过URI(通常为“content://com.fnord.mushroom/mushroom/43”形式)来解决,这意味着其他应用程序也可以访问您的数据。

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

不利的一面是,ContentProviders只能真正支持通过有限接口进行访问---用SQL术语来说,您可以在没有嵌套子句的情况下获得INSERT,SELECT,UPDATE和DELETE。如果您正在执行复杂的SQL工作,将请求从您的应用程序路由到ContentProvider然后再返回可能会有点痛苦。然而,大多数人不需要这样做(如果你这样做,定制意图是要走的路)。