isOpen函数是仅适用于Room数据库还是也支持原生SQLite?
问题结论
- androidx.room 包下的
isOpen()确实是Room专属API,不适用于原生SQLite。原生SQLite判断连接状态可以直接使用系统自带的android.database.sqlite.SQLiteDatabase.isOpen()方法。
始终返回false的原因分析
你贴的Room源码逻辑很清晰,我们可以拆解判断规则:
/** * 返回true代表数据库连接已打开且完成初始化 * * @return 连接已打开返回true,否则返回false */ public boolean isOpen() { // 针对自动关闭数据库的特殊处理:mDatabase是底层数据库实例,而非外层包装的实例 if (mAutoCloser != null) { return mAutoCloser.isActive(); } final SupportSQLiteDatabase db = mDatabase; return db != null && db.isOpen(); }
按照上述逻辑,返回false的常见场景如下:
- 还没有执行过任何数据库读写操作:Room默认采用懒加载策略初始化数据库连接,仅调用
Room.databaseBuilder().build()并不会触发连接建立,此时mDatabase为null,自然返回false - 已经主动调用了RoomDatabase的
close()方法关闭了数据库 - 开启了Room的自动关闭功能(配置了
setAutoCloseTimeout()),当前连接已经超过超时时间被自动释放
验证方法
可以先执行一次任意轻量数据库操作,例如执行一次无意义的查询roomDatabase.query("SELECT 1", null),之后再调用isOpen(),正常情况下就会返回true。
内容的提问来源于stack exchange,提问作者Ahmad Albatsh
相关产品推荐
相关产品推荐

