如何从Room数据库中获取SQLiteDatabase实例
问题原因
Room内部默认使用的是androidx.sqlite.db.SupportSQLiteDatabase接口封装的数据库实例,和你旧代码用到的原生android.database.sqlite.SQLiteDatabase不属于同一个类继承体系,所以直接强转会触发类型转换异常。
可行解决方案
方案1:直接获取底层原生实例(适配现有旧代码优先推荐)
SupportSQLiteDatabase本身提供了获取内部封装的原生数据库实例的方法,你可以通过如下代码实现需求,不需要修改现有接收SQLiteDatabase参数的旧函数逻辑:
public abstract class Database_ROOM extends RoomDatabase { public SQLiteDatabase getSQLiteDB() { // 先获取SupportSQLiteDatabase封装实例 SupportSQLiteDatabase supportDb = this.getOpenHelper().getWritableDatabase(); // 取出内部原生SQLiteDatabase实例后强转即可 return (SQLiteDatabase) supportDb.getWrappedDatabase(); } }
注意事项:
- 调用该方法前请确保Room数据库已经完成正常初始化,不要在Room数据库实例创建的回调生命周期内提前调用,避免空指针异常
- 该方法仅适用于Room使用默认原生SQLite驱动的场景,如果你自定义了第三方SQLite驱动(比如SQLCipher加密驱动),该方法返回的类型会有差异,需要对应调整
方案2:参数类型适配(长期过渡改造方案)
如果后续逐步迭代改造代码,可以先把旧方法的入参类型从SQLiteDatabase替换为SupportSQLiteDatabase,两者的API设计几乎完全一致,大部分场景下仅需要修改参数类型不需要调整内部业务逻辑,改造成本极低,适配后可以直接传入Room返回的SupportSQLiteDatabase实例,不需要做任何类型转换。
内容的提问来源于stack exchange,提问作者Ruwan Liyanage
相关产品推荐
相关产品推荐

