【问题标题】:Why do I need to download whole 'databases' directory in Android to see the contents of SQLite database?为什么我需要在 Android 中下载整个“数据库”目录才能查看 SQLite 数据库的内容?
【发布时间】:2019-04-24 11:36:07
【问题描述】:

所以我成功地从 SQLite 数据库插入和检索数据。但是,如果我转到设备文件资源管理器,将 .db 文件(来自 databases 目录)保存在我的计算机中,并从终端使用sqlite3 打开它(具有 root 访问权限),它显示没有表,没有任何内容(我也尝试了 SQLiteBrowser 和 Database Navigator 插件,结果相同)。

但是,那里也有.db-shm.db-wal 文件,所以如果我下载整个目录然后打开.db,它显示我的内容没有问题。那么这些文件到底是做什么的呢?它们是任何类型的元数据吗?为什么我每次都需要下载它们?

注意:我正在运行一个模拟器。

编辑:对于声称这是重复问题的用户:我看到了链接的问题和答案,但并不清楚这些文件的作用或原因我是否还需要下载它们才能查看我的.db 文件。

【问题讨论】:

标签: android sqlite


【解决方案1】:

来自source

-wal

预写日志 (WAL) 文件
当 SQLite 在 WAL 模式下运行时,使用预写日志或 WAL 文件代替回滚日志。与回滚日志一样,WAL 文件的目的是实现原子提交和回滚。 WAL 文件始终与数据库文件位于同一目录中,并且与数据库文件具有相同的名称,但附加了 4 个字符“-wal”。 WAL 文件是在打开与数据库的第一个连接时创建的,通常会在与数据库的最后一个连接关闭时删除。但是,如果上次连接没有干净地关闭,WAL 文件将保留在文件系统中,并在下次打开数据库时自动清理。

-shm

共享内存文件
在 WAL 模式下操作时,与同一个数据库文件关联的所有 SQLite 数据库连接需要共享一些内存,用作 WAL 文件的索引。在大多数实现中,此共享内存是通过在为此唯一目的创建的文件上调用 mmap() 来实现的:共享内存文件。共享内存文件(如果存在)与数据库文件位于同一目录中,并且与数据库文件具有相同的名称,但附加了 4 个字符“-shm”。共享内存文件仅在 WAL 模式下运行时存在。

共享内存文件不包含持久性内容。唯一的 共享内存文件的目的是提供一个共享块 供访问同一数据库的多个进程使用的内存 在 WAL 模式下。如果 VFS 能够提供替代方法 访问共享内存,则可以使用该替代方法 而不是共享内存文件。例如,如果 PRAGMA lock_mode 设置为 EXCLUSIVE(意味着只有一个进程 能够访问数据库文件),那么共享内存将是 从堆而不是从共享内存文件中分配,并且 永远不会创建共享内存文件。

共享内存文件与其关联的 WAL 具有相同的生命周期 文件。创建 WAL 文件时创建共享内存文件 并在删除 WAL 文件时删除。在 WAL 文件恢复期间, 共享内存文件是根据内容从头开始重新创建的 正在恢复的 WAL 文件。

希望这能为您解决问题。

【讨论】:

    猜你喜欢
    • 2019-02-26
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多