如何让Room数据库中存储的数据在.db文件中可见?
解决Room数据存到.db-wal而非.db的问题
这是因为Room默认开启了SQLite的**Write-Ahead Logging(WAL)**模式,所有写入操作会先写到.db-wal日志文件里,后台会异步把这些操作合并到主.db文件,所以你会看到.db体积不变,.db-wal越来越大。想要让数据在数据库里可见,有几种办法:
1. 用数据库工具直接查看(最推荐)
像DB Browser for SQLite这类工具,只要把.db和.db-wal文件放在同一个文件夹里,打开.db文件时会自动读取WAL里的最新数据,不用等合并到主文件,直接就能看到所有已写入的数据。
2. 手动强制合并WAL到主.db文件
在写入数据完成后,或者需要查看数据前,执行一条SQL命令触发合并:
// 获取你的Room数据库实例后执行 yourRoomDatabase.openHelper.writableDatabase.execSQL("pragma wal_checkpoint(full)")
执行完这条命令,WAL里的内容就会全部写入.db文件,此时.db体积就会更新,打开.db就能看到所有数据。
3. 关闭WAL模式(不推荐,仅临时测试用)
WAL是SQLite优化性能和并发写入的重要机制,关闭会降低性能,但如果只是临时测试,可以在Room初始化时修改日志模式:
@Database(entities = [Word::class], version = 1) abstract class WordRoomDatabase : RoomDatabase() { abstract fun wordDao(): WordDao companion object { @Volatile private var INSTANCE: WordRoomDatabase? = null fun getDatabase(context: Context): WordRoomDatabase { return INSTANCE ?: synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, WordRoomDatabase::class.java, "word_database" ) .openHelperFactory(object : SupportSQLiteOpenHelper.Factory { override fun create(configuration: SupportSQLiteOpenHelper.Configuration): SupportSQLiteOpenHelper { // 改用TRUNCATE日志模式,关闭WAL val newConfig = configuration.copy( journalMode = SupportSQLiteOpenHelper.Configuration.JournalMode.TRUNCATE ) return FrameworkSQLiteOpenHelperFactory().create(newConfig) } }) .build() INSTANCE = instance instance } } } }
内容的提问来源于stack exchange,提问作者Андрій Х
相关产品推荐
相关产品推荐

