Android应用配置SQLite journal_mode崩溃,如何正确执行PRAGMA语句?
解决Android Room中配置SQLite journal_mode的崩溃问题
问题原因
PRAGMA journal_mode=MEMORY属于返回结果的查询型PRAGMA,执行后会返回当前生效的日志模式值。而你使用的execSQL()方法仅适用于执行无返回结果的SQL语句(如插入、更新、删除操作),底层会尝试用处理更新操作的逻辑执行这个有返回值的语句,从而触发SQLiteException异常。
正确配置方式
使用rawQuery()方法替代execSQL()来执行这类返回结果的PRAGMA语句,推荐用Kotlin的use块自动管理Cursor资源:
@Provides @Singleton fun providesRoomDatabaseCallback(@ApplicationContext appContext: Context): RoomDatabase.Callback { return object : RoomDatabase.Callback() { override fun onCreate(db: SupportSQLiteDatabase) { super.onCreate(db) db.execSQL("PRAGMA temp_store=2;") // 改用rawQuery执行journal_mode配置 db.rawQuery("PRAGMA journal_mode=MEMORY", null).use { cursor -> // 可选:读取返回的当前journal_mode值 if (cursor.moveToFirst()) { val mode = cursor.getString(0) } } db.execSQL("PRAGMA auto_vacuum=incremental;") } } }
额外说明
- 区分两类PRAGMA语句:
- 无返回结果的设置型PRAGMA(如
temp_store=2、auto_vacuum=incremental):可继续用execSQL()执行 - 返回结果的查询/配置型PRAGMA(如
journal_mode、cache_size):必须用rawQuery()执行
- 无返回结果的设置型PRAGMA(如
内容的提问来源于stack exchange,提问作者Hector
相关产品推荐
相关产品推荐

