30

在我的 andoid 应用程序的数据库目录(/data/data/com.me.myApp/databases)中,对于我创建的每个 sqlite 数据库,都有一个相应的同名数据库,并在其名称后附加了“-journal”。

例如:myDatabase、myDatabase-journal、myOtherDatabase.db、myOtherDatabase.db-journal

这是什么?

和,

如果我为我的应用程序提供预填充的数据库(根据:http ://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/ )我需要包括这些也是?

4

3 回答 3

32

此类-journal文件不需要(也不应该分发。

这是因为各种日志文件代表SQLite 使用的临时数据(参考SQLite 的 Use Of Temporary Disk Files)。特别是-journal文件是回滚日志

回滚日志是用于在 SQLite 中实现原子提交和回滚功能的临时文件。(有关其工作原理的详细讨论,请参阅名为 Atomic Commit In SQLite 的单独文档。)回滚日志始终与数据库文件位于同一目录中,并且与数据库文件具有相同的名称,除了 8 个字符“ -期刊”附加。

回滚日志通常在事务首次启动时创建,通常在事务提交或回滚时删除。回滚日志文件对于实现 SQLite 的原子提交和回滚功能至关重要。如果没有回滚日志,SQLite 将无法回滚不完整的事务,并且如果在事务中间发生崩溃或断电,则整个数据库可能会在没有回滚日志的情况下损坏。

一般来说,这些-journal文件应该只存在打开的 SQLite 数据库 - 或者更确切地说,正在运行的事务 - 但可以通过PRAGMA journal_mode控制。使用默认的编译指示设置,-journal文件将被删除。

DELETE 日志模式是正常行为。在 DELETE 模式下,回滚日志在每个事务结束时被删除。实际上,删除操作是导致事务提交的操作。

确保仅在数据库打开且 SQLite 本身已删除(或清除)所有日志时才复制实际的数据库文件;这意味着所有事务都已完成并且数据库处于一致状态。

于 2014-10-06T01:54:11.400 回答
0

DB-JOURNAL 文件是 SQLite 数据库管理系统在应用程序和数据库之间的事务期间创建的临时数据库文件。它包含一个回滚日志,它是一个临时数据库,用于存储数据库的最新状态。

于 2021-04-14T01:26:56.793 回答
0

问题就此解决了吗?我有一种情况,我无法从 android 设备复制我想在本地机器上复制的 .db。我必须手动删除设备上的 -journal 才能成功复制 .db。这是我用 C# 编写的代码

var devices = MediaDevice.GetDevices();
using (var device = devices.First(d => d.Description == "PM67"))
{
    device.Connect();
    var photoDir = device.GetDirectoryInfo(@"\Internal Shared Storage\Databases");

    var files = photoDir.EnumerateFiles("database.db", SearchOption.AllDirectories);

    foreach (var file in files)
    {
        MemoryStream memoryStream = new System.IO.MemoryStream();
        device.DownloadFile(file.FullName, memoryStream);
        memoryStream.Position = 0;

        try
        {
            device.DeleteFile(@"\Internal Storage\Databases\database.db-journal");//this is the part where I'd like to delete the -journal but it's not working
        }
        catch
        {
        }

        try
        {
            if (File.Exists(result) == true)
            {
                File.Delete(result);
            }
        }
        catch
        {
        }
        WriteSreamToDisk(result, memoryStream);
    }
    device.Disconnect();
}
于 2021-11-26T01:06:21.547 回答