Android 房间数据库文件为空 - .db、.db-shm、.db-wal

Android Room database file is empty - .db, .db-shm, .db-wal

使用 android 中的空间作为数据库。当我试图在 sqlviewer 中查看数据时,在数据库文件中找不到表 Myapp.db 文件为空。 Data/data/packageName/databases/Myapp.db

转到文件夹 Data/data/packageName/databases/ 必须有三个文件 .db.db-shm.db-wal,将所有三个文件复制到一个位置,然后打开您的 Myapp.db打开db文件需要这两个额外的文件

检查您的数据库后 class,

@Database(entities = arrayOf(Test::class), version = 1, exportSchema = false)

abstract class MyDatabase:RoomDatabase() {
       private var INSTANCE: MyDatabase? = null
       abstract fun testDao(): TestDao
}

在这里,MyDatabase 是我的数据库 class,Test 是 table 名称,TestDao 是 Dao class。

在 android 工作室 3.1.*

在工具window栏中点击“Device File explorer”,通常你可以在屏幕的右下角找到它

打开 data/data/your-application-package/databases

中的目录

使用新架构在数据库目录中创建了 3 个文件

your-database-name
your-database-name-shm
your-database-name-wal

您必须将所有 3 个导出到同一目录

然后在任何 sqlite 浏览器中打开第一个文件(仅包含您的数据库名称)。

现在您可以看到您的所有数据......

your-database-name-shm
your-database-name-wal

打开db文件需要这两个额外的文件 如果您只打开数据库文件,那么您将不会在该文件中找到任何 table

我保存了整个文件夹,仅此而已,我可以浏览 table。

确保在退出应用程序时关闭数据库,这将确保提交所有未完成的事务:

@Override
protected void onDestroy() {
    super.onDestroy();

    // close the primary database to ensure all the transactions are merged
    MyAppDatabase.getInstance(getApplicationContext()).close();
}

然后您可以使用 Android Studio 中的设备文件资源管理器从您的设备复制数据库(在 /data/data/<您的应用程序包名称>/databases 下查找)。

您也可以 而不是关闭数据库,但以我的拙见,此选项更简单(除非您尝试以编程方式或类似方式在应用程序中备份数据库)并关闭databases 是个好主意(即使 Android Room 文档中没有真正提到它)。

在此处阅读有关 sqlite WAL 的更多信息:https://www.sqlite.org/wal.html