Android打开和关闭数据库

6
我在StackOverflow和互联网上阅读了很多关于何时打开和关闭sqlite数据库的讨论。来自不同时间段的大量回复和猜测让我更加困惑。人们提出的建议有:
  1. 在onDestroy()中关闭数据库。 评论:“onDestroy()并非总是被调用!使用onStop()!”--> 因此需要在onStart()中打开它。
  2. 数据库有效运行,无需关闭。
  3. 打开数据库一次,并创建一个字段和访问器。
  4. 使用后关闭。
还有很多其他建议...... 那么,2016年正确的做法是什么?请不要猜测!
示例链接: Android:打开和关闭SQLite数据库 Android关闭数据库

1
我的口号是:“打开它,使用它,关闭它。打开它,使用它,关闭它。打开它,使用它,关闭它。打开它,使用它,关闭它......”这适用于我所有的事务和/或单个CRUD操作。 - Phantômaxx
2
仅仅因为现在是2016年,并不意味着在Android上使用Sqlite的方式有任何改变。 - OneCricketeer
@cricket_007 根据那个逻辑,它应该已经被充分证实了。 - XxGoliathusxX
如何遵循最佳实践:https://dev59.com/6XE95IYBdhLWcg3wCJNf,或何时关闭SQLite数据库:https://dev59.com/hG455IYBdhLWcg3wD_6Z。 - OneCricketeer
1个回答

10

在计算机编程中,关闭SQLite数据库(通过SQLiteOpenHelper上的close()或通过其他方法上的SQLiteDatabase上的close())的时间并没有单一的“正确操作”。

唯一相当严格的规则是:不要同时在多个线程中为同一个数据库使用多个SQLiteDatabase对象,除非进行自己的线程同步。如果您坚持每个数据库只使用一个SQLiteDatabase对象,则线程同步在SQLiteDatabase内部处理。

由于一个数据库适用于所有线程的规则,并且在许多情况下,当您有许多不同的组件时跟踪线程何时可能或不可能需要数据库会很棘手,因此一些开发人员采取了拥有单例数据库管理器的方法,该管理器将惰性打开数据库...并从不关闭它。例如,使用此模式的基于数据库的ContentProvider,因为ContentProvider永远不会被销毁,因此没有明确的时间来关闭数据库。

个人而言,我会选择这种方法而不是打开-使用-关闭方法,特别是如果您正在使用Android的SQLCipher(一个加密的SQLite替换品)。但是,如果您确定每次只有一个线程将使用数据库,则使用打开-使用-关闭方法没有什么特别的问题。

如果只有一个组件使用数据库,则在onCreate()中触发打开数据库并在onDestroy()中关闭它是没有问题的。毕竟,如果这是唯一需要数据库的组件,则当组件本身消失时不需要数据库。

在onDestroy()中关闭数据库的评论:“onDestroy()并不总是被调用!使用onStop()!”-->因此,onStart()必须打开它。

如果一个组件没有调用onDestroy()方法,可能是因为这个组件中出现了未处理的异常导致崩溃,或者进程被终止。后一种情况不是问题(这就是ContentProvider的工作方式,因为提供程序永远不会被销毁)。前一种情况不应该是问题,只要你不在多个线程上意外地同时使用旧的SQLiteDatabase和新的SQLiteDatabase

数据库能高效运行,所以不需要关闭它。

这并不是效率的问题。SQLite是事务性的。不关闭数据库也不是问题,因为没有未刷新的缓冲区或其他你需要担心的事情。

打开你的数据库一次,并创建一个字段和一个访问器。

这与关闭数据库的时间没有直接关系。

使用完之后关闭它。

这是一种模式,如果正确使用可以起到作用。


首先感谢您的详细回答!因为我正在使用相同的数据库访问所有活动,而且我没有使用多线程,所以使用onStart()与onDestroy()版本是最好的,对吗? - XxGoliathusxX
2
@XxGoliathusxX: "而且我没有使用多线程" -- 你真的需要在后台线程上进行数据库访问。不要在主应用程序线程上执行磁盘I/O、网络I/O或其他耗时操作,因为在该工作完成之前,你的UI将被冻结。 - CommonsWare
我不知道怎么做。你能给我提供一个好的教程链接吗? - XxGoliathusxX
@XxGoliathusxX:https://developer.android.com/training/multiple-threads/index.html 是来自文档的。这是一个示例应用程序,展示了在后台线程上进行数据库I/O的我的书籍 - CommonsWare
我会去查看。非常感谢! - XxGoliathusxX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接