我在这里阅读了很多关于StackOverflow的讨论,还有很多关于互联网网站的讨论:我什么时候应该打开和关闭我的sqlite数据库。 我已经阅读了不同时期的各种回应和猜测。 所以最后我比以前更困惑。人们建议:
在onDestroy()中关闭数据库 评论:" OnDestroy()总是不被调用!使用onStop()!" - >所以onStart()必须打开它。
数据库有效运行。无需关闭它。
打开您的数据库并创建一个字段和一个访问者。
使用后关闭。
还有更多......
2016年什么是正确的?请不要猜!
Examplelinks:
答案 0 :(得分:8)
与计算机编程中的许多内容一样,关闭SQLite数据库的时间没有单一“正确的继续”(如果您使用close()
,则通过SQLiteOpenHelper
,或{{ 1}} close()
否则)。
一个相当硬的规则是不要同时跨多个线程为同一个数据库使用多个SQLiteDatabase
对象。这可能会让你遇到麻烦,除非你正在进行自己的线程同步。如果您坚持每个数据库使用一个SQLiteDatabase
对象,则会在SQLiteDatabase
内处理线程同步。
由于one-database-for-all-threads规则,并且因为在很多情况下跟踪何时线程可能或可能不想要数据库在你有许多不同的组件时可能会很棘手,一些开发人员采取的方法是单例数据库管理器,它懒惰地打开数据库......并且永远不会关闭它。例如,数据库支持的SQLiteDatabase
使用此模式,因为ContentProvider
永远不会被销毁,因此没有明确的时间关闭数据库。
就个人而言,我会采用开放式使用 - 关闭方式,特别是如果您使用SQLCipher for Android(加密的SQLite替代品)。但是,如果您确定一次只有一个线程可以使用数据库,那么open-use-close方法没有什么特别的错误。
如果只有一个组件使用数据库,则触发在ContentProvider
中打开数据库并在onCreate()
中关闭数据库没有任何问题。毕竟,如果这是唯一需要数据库的组件,那么当组件本身消失时,您不需要数据库。
在onDestroy()中关闭你的数据库注释:“OnDestroy()不会一直被调用!使用onStop()!” - >所以onStart()必须打开它。
如果未在组件上调用onDestroy()
,则表明您在该组件中遇到未处理的异常,或者您的进程已终止。后一种情况不是问题(同样,这是onDestroy()
的工作方式,因为提供者永远不会被破坏)。前一种情况应该不是问题,只要您不会在多个线程中意外地同时使用较旧的ContentProvider
和一些较新的SQLiteDatabase
。
数据库有效运作。无需关闭它。
这不是效率问题。 SQLite是事务性的。无法关闭数据库不是问题,因为没有未刷新的缓冲区或您需要担心的事情。
打开您的数据库一次,然后创建一个字段和一个访问者。
这与关闭数据库时没有任何关系。
使用后关闭。
这是一种模式,并且正确完成它可以工作。