Android 打开和关闭数据库
Android Open and Close Database
我在 Whosebug 和互联网网站上阅读了很多关于以下内容的讨论:我应该何时打开和关闭我的 sqlite 数据库。
我阅读了不同时期的各种回应和猜测。
所以最后我比以前更困惑了。人们的建议:
在 onDestroy() 中关闭你的数据库
评论:"OnDestroy() does not get called always! Use onStop()!"
--> 所以 onStart() 必须打开它。
数据库工作效率很高。不用关闭。
打开您的数据库一次并创建一个字段和一个访问器。
使用后关闭
还有更多...
那么2016年正确的做法是什么?请勿猜测!
示例链接:
Android: opening and closing SQLite database
Android Closing database
与计算机编程中的许多事情一样,没有单一的 "correct proceed" 用于关闭 SQLite 数据库的时间(通过 close()
on SQLiteOpenHelper
如果你正在使用它,或 close()
在 SQLiteDatabase
否则)。
一个相当严格的规则是不要同时跨多个线程为同一个数据库使用多个 SQLiteDatabase
对象。这会给您带来麻烦,除非您正在执行自己的线程同步。如果您坚持每个数据库一个 SQLiteDatabase
对象,则线程同步在 SQLiteDatabase
.
内部处理
由于所有线程一个数据库的规则,并且在许多情况下,当您有许多不同的组件时,跟踪线程可能需要或不需要数据库的时间可能会很棘手,一些开发人员采用的方法是有一个单独的数据库管理器,它可以延迟打开数据库......并且永远不会关闭它。例如,数据库支持的 ContentProvider
使用此模式,因为 ContentProvider
永远不会被销毁,因此没有明确的时间关闭数据库。
就我个人而言,我会采用开放-使用-关闭的方法,特别是如果您将 SQLCipher 用于 Android(一种加密的 SQLite 替代品)。但是,如果您确定一次只有一个线程将使用数据库,那么打开-使用-关闭方法并没有什么特别的错误。
如果只有一个组件使用数据库,触发在onCreate()
打开数据库并在onDestroy()
关闭它没有错。毕竟,如果那是唯一需要数据库的组件,那么当组件本身消失时,您就不需要数据库了。
Close your db in onDestroy() Comments: "OnDestroy() does not get called always! Use onStop()!" --> So onStart() has to open it.
如果 onDestroy()
没有在某个组件上被调用,要么是您在该组件中因未处理的异常而崩溃,要么您的进程已终止。后一种情况不是问题(同样,这是 ContentProvider
的工作方式,因为提供者永远不会被销毁)。前一种情况应该不是问题,只要您不意外地跨多个线程同时使用较旧的 SQLiteDatabase
和一些较新的 SQLiteDatabase
。
The db works efficiently. No need to close it.
这不是效率问题。 SQLite 是事务性的。无法关闭数据库不是问题,因为没有未刷新的缓冲区或您需要担心的事情。
Open your db once and create a field and an accessor.
这与您何时关闭数据库没有直接关系。
Close after use.
这是一个模式,做得好它可以工作。
我在 Whosebug 和互联网网站上阅读了很多关于以下内容的讨论:我应该何时打开和关闭我的 sqlite 数据库。 我阅读了不同时期的各种回应和猜测。 所以最后我比以前更困惑了。人们的建议:
在 onDestroy() 中关闭你的数据库 评论:"OnDestroy() does not get called always! Use onStop()!" --> 所以 onStart() 必须打开它。
数据库工作效率很高。不用关闭。
打开您的数据库一次并创建一个字段和一个访问器。
使用后关闭
还有更多...
那么2016年正确的做法是什么?请勿猜测!
示例链接:
Android: opening and closing SQLite database
Android Closing database
与计算机编程中的许多事情一样,没有单一的 "correct proceed" 用于关闭 SQLite 数据库的时间(通过 close()
on SQLiteOpenHelper
如果你正在使用它,或 close()
在 SQLiteDatabase
否则)。
一个相当严格的规则是不要同时跨多个线程为同一个数据库使用多个 SQLiteDatabase
对象。这会给您带来麻烦,除非您正在执行自己的线程同步。如果您坚持每个数据库一个 SQLiteDatabase
对象,则线程同步在 SQLiteDatabase
.
由于所有线程一个数据库的规则,并且在许多情况下,当您有许多不同的组件时,跟踪线程可能需要或不需要数据库的时间可能会很棘手,一些开发人员采用的方法是有一个单独的数据库管理器,它可以延迟打开数据库......并且永远不会关闭它。例如,数据库支持的 ContentProvider
使用此模式,因为 ContentProvider
永远不会被销毁,因此没有明确的时间关闭数据库。
就我个人而言,我会采用开放-使用-关闭的方法,特别是如果您将 SQLCipher 用于 Android(一种加密的 SQLite 替代品)。但是,如果您确定一次只有一个线程将使用数据库,那么打开-使用-关闭方法并没有什么特别的错误。
如果只有一个组件使用数据库,触发在onCreate()
打开数据库并在onDestroy()
关闭它没有错。毕竟,如果那是唯一需要数据库的组件,那么当组件本身消失时,您就不需要数据库了。
Close your db in onDestroy() Comments: "OnDestroy() does not get called always! Use onStop()!" --> So onStart() has to open it.
如果 onDestroy()
没有在某个组件上被调用,要么是您在该组件中因未处理的异常而崩溃,要么您的进程已终止。后一种情况不是问题(同样,这是 ContentProvider
的工作方式,因为提供者永远不会被销毁)。前一种情况应该不是问题,只要您不意外地跨多个线程同时使用较旧的 SQLiteDatabase
和一些较新的 SQLiteDatabase
。
The db works efficiently. No need to close it.
这不是效率问题。 SQLite 是事务性的。无法关闭数据库不是问题,因为没有未刷新的缓冲区或您需要担心的事情。
Open your db once and create a field and an accessor.
这与您何时关闭数据库没有直接关系。
Close after use.
这是一个模式,做得好它可以工作。