Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/198.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android中的数据库访问_Java_Android_Database_Sqlite_Android Activity - Fatal编程技术网

Java Android中的数据库访问

Java Android中的数据库访问,java,android,database,sqlite,android-activity,Java,Android,Database,Sqlite,Android Activity,我正在创建一个android应用程序,它基本上是一个蘑菇信息列表。我从sqlite数据库中获取此信息。我有一个全局单例,其中包含一个用于访问数据库的服务类。几乎每个活动都访问数据库。是让我的数据库一直处于打开状态还是在需要数据时打开并关闭它更好 如果最佳做法是一直保持打开状态,那么我需要在哪里确保关闭它?如果在活动被销毁时保持打开状态,最坏的情况是什么?我会根据需要打开数据库。这样,一旦打开连接的特定活动完成,您就可以确定该连接已关闭。虽然Android内置了检查功能,以确保在应用程序终止时关闭

我正在创建一个android应用程序,它基本上是一个蘑菇信息列表。我从sqlite数据库中获取此信息。我有一个全局单例,其中包含一个用于访问数据库的服务类。几乎每个活动都访问数据库。是让我的数据库一直处于打开状态还是在需要数据时打开并关闭它更好


如果最佳做法是一直保持打开状态,那么我需要在哪里确保关闭它?如果在活动被销毁时保持打开状态,最坏的情况是什么?

我会根据需要打开数据库。这样,一旦打开连接的特定活动完成,您就可以确定该连接已关闭。虽然Android内置了检查功能,以确保在应用程序终止时关闭,但出于安全考虑,这并没有什么坏处。我还猜测,一直打开它可能会导致泄漏或其他事情

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

这给您带来了几个好处:

只有一件事是数据库打开的,所以问题就迎刃而解了。 有很多标准的支持类来自动化数据库管理之类的东西。 更好地与标准Android列表管理视图集成,这些视图都是为自动使用ContentProviders提供的游标而设计的。 您的所有数据都可以通过URI进行寻址,URI通常为content://com.fnord.mushroom/mushroom/43,这意味着其他应用程序也可以访问您的数据。 使用ContentProvider,可以将三个或四个标准类粘合在一起,生成数据库的浏览器界面,而不必编写任何真正的逻辑


消极的一面是,ContentProviders只支持通过SQL术语中的有限接口进行访问,您可以获得INSERT、SELECT、UPDATE和DELETE,而不需要嵌套子句。如果您正在执行复杂的SQL操作,那么将请求从应用程序路由到ContentProvider,然后再路由到ContentProvider,可能会有点痛苦。然而,大多数人不需要这样做,如果你这样做了,定制意图就是最好的选择。

根据我过去在Java方面的经验,我认为最好关闭连接,这在一个小型Android应用程序中可能并不重要,但如果你有10个应用程序正在运行,并且所有应用程序都访问数据库,您有10个挂起的连接。再启动几次,迟早另一个应用程序将不得不等待,因为SQL server无法处理更多的请求

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

现在我对Android编程非常陌生,所以我没有时间实现数据库调用。但是几年前,当我在Java应用程序中遇到同样的问题时,我实现了一个数据库对象,在其中我与数据库建立了连接。其他所有类都必须调用数据库对象singleton或final方法来获取数据,这有点像存储过程,但实际上是在应用程序中

正因为如此,我知道电话什么时候打,什么时候停。然后我设置了一个超时,这样,如果几分钟内什么也没发生,我就会关闭与数据库的连接。这还处理了一些超时异常,因为连接的超时永远不会发生。当输入新呼叫时,我可以轻松地启动新连接并使用新的db连接


基本上,我通过使用public-muscular[]getallmuscular和public-muscular[]getFilteredFungusstring where等方法来抽象SQL调用。

我正在打开数据库,使用它,然后一完成就关闭它。当我开始另一项活动时,我将在Resume上再次打开,在Pause和onDestroy上关闭。新活动的行为与此相同。当我销毁当前活动并返回上一屏幕时,在调用onResume之前,我的适配器尝试重新连接到数据库,我得到了异常“关于fillWindow的某些信息”。在调用数据库项目处理程序对象上的getWritable数据库之前,为了避免fillWindow异常,对其调用close可能会在onFinish或onStop上执行close。您说过要在onDestroy上关闭它。onResume之后调用onDestroy是可能的。这将导致您的全局数据库关闭您不希望它关闭的内容:如果您在Android中实现数据库,您应该使用SQLiteOpenHelper或ContentProvider来管理您的连接。然后,您可以返回游标,让您在结果集上迭代,或者非常容易地将其放置在列表中。