- 在onDestroy()中关闭数据库。 评论:“onDestroy()并非总是被调用!使用onStop()!”--> 因此需要在onStart()中打开它。
- 数据库有效运行,无需关闭。
- 打开数据库一次,并创建一个字段和访问器。
- 使用后关闭。
示例链接: Android:打开和关闭SQLite数据库 Android关闭数据库
在计算机编程中,关闭SQLite数据库(通过SQLiteOpenHelper
上的close()
或通过其他方法上的SQLiteDatabase
上的close()
)的时间并没有单一的“正确操作”。
唯一相当严格的规则是:不要同时在多个线程中为同一个数据库使用多个SQLiteDatabase
对象,除非进行自己的线程同步。如果您坚持每个数据库只使用一个SQLiteDatabase
对象,则线程同步在SQLiteDatabase
内部处理。
由于一个数据库适用于所有线程的规则,并且在许多情况下,当您有许多不同的组件时跟踪线程何时可能或不可能需要数据库会很棘手,因此一些开发人员采取了拥有单例数据库管理器的方法,该管理器将惰性打开数据库...并从不关闭它。例如,使用此模式的基于数据库的ContentProvider
,因为ContentProvider
永远不会被销毁,因此没有明确的时间来关闭数据库。
个人而言,我会选择这种方法而不是打开-使用-关闭方法,特别是如果您正在使用Android的SQLCipher(一个加密的SQLite替换品)。但是,如果您确定每次只有一个线程将使用数据库,则使用打开-使用-关闭方法没有什么特别的问题。
如果只有一个组件使用数据库,则在onCreate()
中触发打开数据库并在onDestroy()
中关闭它是没有问题的。毕竟,如果这是唯一需要数据库的组件,则当组件本身消失时不需要数据库。
如果一个组件没有调用在onDestroy()中关闭数据库的评论:“onDestroy()并不总是被调用!使用onStop()!”-->因此,onStart()必须打开它。
onDestroy()
方法,可能是因为这个组件中出现了未处理的异常导致崩溃,或者进程被终止。后一种情况不是问题(这就是ContentProvider
的工作方式,因为提供程序永远不会被销毁)。前一种情况不应该是问题,只要你不在多个线程上意外地同时使用旧的SQLiteDatabase
和新的SQLiteDatabase
。
数据库能高效运行,所以不需要关闭它。
这并不是效率的问题。SQLite是事务性的。不关闭数据库也不是问题,因为没有未刷新的缓冲区或其他你需要担心的事情。
打开你的数据库一次,并创建一个字段和一个访问器。
这与关闭数据库的时间没有直接关系。
使用完之后关闭它。
这是一种模式,如果正确使用可以起到作用。