【问题标题】:Android Room database file is empty - .db, .db-shm, .db-walAndroid Room 数据库文件为空 - .db、.db-shm、.db-wal
【发布时间】:2018-10-26 14:28:12
【问题描述】:

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

【问题讨论】:

  • 那么您是否尝试查询数据库?或者他们也不工作?包括您的数据库和插入/查询的代码,以便人们可以帮助您。
  • 我可以使用查询在 android 中获取数据。
  • 但不在任何查看器中...
  • 哦,那this 回答可能会有所帮助:)
  • 已经探索过这个.. .. 看看我什么时候没有 Room 然后我可以在表中找到数据.. 但是当我使用 room 然后没有数据没有表只在那个文件中找到

标签: android sql android-room


【解决方案1】:

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

【讨论】:

  • 做同样的事情但没有找到表
  • 使用数据库浏览器进行sqlite,很可能是因为您的编辑器不支持新房间版本发布的新sql函数
  • sqlite 的 DB 浏览器出现同样的错误。文件大小仅为 4KB
  • 我明白了,.db-wal 文件包含所有数据。
  • 我现在也试过了,所以在保存文件时它似乎在 android studio 中出现了某种错误,因为它有时会工作,有时会显示空数据库。我所做的保存了所有三个文件打开的 .db 文件它是空的所以我关闭了 db 编辑器删除了所有保存的文件并再次打开然后它是所有数据
【解决方案2】:

在android studio 3.1.*中

在工具窗口栏中点击“Device File explorer”一般你可以在屏幕的右下角找到它n

data/data/your-application-package/databases中打开目录

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

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

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

然后在任何 sqlite 浏览器中打开第一个文件(仅包含 your-database-name )。

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

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

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

【讨论】:

  • 我有同样的问题请查看link
  • 您可能需要将文件重命名为:your-database-name.dbyour-database-name.db-shmyour-database-name.db-wal
【解决方案3】:

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

@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)。

你也可以force a WAL checkpoint而不是关闭数据库,但在我看来这个选项更容易(除非你试图以编程方式在应用程序中备份你的数据库或类似的东西)并且关闭数据库是一个很好的选择想法(即使 Android Room 文档中并未真正提及)。

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

【讨论】:

  • 谢谢...我的根本问题是我没有复制所有 3 个文件
  • @KKSINGLA 我的解决方案意味着您不需要复制所有 3 个文件,这更容易恕我直言
  • 很好,我也试试这个
  • 不保证 onDestroy 会在你的活动中被调用,并且这些文件被 Room 使用,所以它们总是在那里,无法摆脱它们,除非你设置 WriteAhead。
  • @live-love 你必须了解问题的上下文和我的答案。当然可以让 Sqlite 完成所有未完成的事务,从而将所有数据从 wal 文件移动到主数据库文件中。如果您想将数据从设备上导出并在计算机上查看,这将很有帮助。但是,您是正确的 - 不能保证 onDestroy,但如果您可以控制,您可以确保它是正确的。
【解决方案4】:

我保存了整个文件夹,就这样,我可以浏览表格了。

【讨论】:

  • Ofc 它与您一起工作,不是偶然,而是因为需要其他数据库文件才能打开原始数据库文件。请提供更准确的答案以及它应该起作用的原因。
  • @blueware 你是对的,我的错。将尽快更新,请您也可以帮助改善答案。
【解决方案5】:

一旦检查了你的数据库类,

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

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

这里,MyDatabase 是我的 Database 类,Test 是表名,TestDao 是 Dao 类。

【讨论】:

    猜你喜欢
    • 2014-02-10
    • 2021-11-13
    • 2011-12-08
    • 2013-09-11
    • 1970-01-01
    • 2020-08-13
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多