使用sqflite时DatabaseHelper的静态_db变量何时不为空?
sqflite DatabaseHelper 实现疑问解答
1. 应用每次启动时_db初始为null,会不会导致每次都新建表?
不会。openDatabase的onCreate回调仅会在设备对应路径下的数据库文件(你代码里是todo.db)首次生成时触发。只要本地已经存在该数据库文件,且传入的版本号和数据库的当前版本号一致,哪怕每次启动都重新调用openDatabase,也只会打开已有的数据库文件,不会触发onCreate逻辑,更不会重复建表覆盖原有数据。
2. _db变量在什么情况下才会不为空?
有且仅有两种情况:
- 应用进程存活期间,首次调用
createDB()方法执行完成后,_db会被赋值为已成功打开的数据库实例,后续所有调用createDB()都会直接返回该实例,不会重复执行初始化逻辑。 - 只要应用进程没有被销毁(用户没手动杀应用、系统没回收进程),
_db就会一直保持非空状态,只有进程销毁后静态变量被回收,下次启动时才会回到初始的null状态。
补充优化建议
你当前的createDB方法命名可以调整为getDatabase更符合语义,因为该方法核心逻辑是优先复用已有的数据库实例,并非每次调用都会创建新的数据库。
内容的提问来源于stack exchange,提问作者Mariam Albarghouti
相关产品推荐
相关产品推荐

