与计算机编程中的许多事情一样,关闭SQLite数据库的时间没有单一的“正确进行”(如果您正在使用它,则通过SQLiteOpenHelper上的close(),否则对SQLiteDatabase执行close()).
一个相当硬的规则是不要同时跨多个线程为同一个数据库使用多个SQLiteDatabase对象.这可能会让你遇到麻烦,除非你正在进行自己的线程同步.如果您坚持每个数据库使用一个SQLiteDatabase对象,则在SQLiteDatabase中处理线程同步.
由于one-database-for-all-threads规则,并且因为在许多不同的组件中跟踪何时线程可能或可能不想要数据库可能会很棘手,一些开发人员采用单一数据库管理器的方法,懒惰打开数据库……永远不会关闭它.例如,数据库支持的ContentProvider使用此模式,因为ContentProvider永远不会被销毁,因此没有明确的时间关闭数据库.
就个人而言,我会通过开放式使用 – 关闭方法走这条路线,特别是如果你使用SQLCipher for Android(加密的SQLite替代品).但是,如果您确定一次只有一个线程可以使用数据库,那么open-use-close方法没有什么特别的错误.
如果只有一个组件使用数据库,则触发在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.
这是一种模式,并且正确完成它可以工作.