You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()执行

内容的提问来源于stack exchange,提问作者Hector

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:55:15