为什么我需要在Android中下载整个“数据库”目录才能查看SQLite数据库的内容?

时间:2019-04-24 11:36:08

标签: android sqlite

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

但是,其中也有.db-shm.db-wal个文件,因此,如果我下载整个目录然后打开.db,它可以毫无问题地显示内容。那么这些文件到底是做什么的?它们是任何一种元数据吗?为什么我也需要每次都下载它们?

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

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

1 个答案:

答案 0 :(得分:1)

source

-瓦尔

  

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

-shm

  

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

     

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

     

共享内存文件的生存期与其关联的WAL相同   文件。创建WAL文件时,将创建共享内存文件   并且在删除WAL文件时被删除。在WAL文件恢复期间,   基于内容从头开始重新创建共享内存文件   恢复的WAL文件。

希望这会为您清除一切。