在我的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/)我需要把这些也包括在内吗?"
这样的-journal
文件不需要分发(也应该是而不是)。
这是因为各种日志文件表示SQLite使用的临时数据(参见SQLite的使用临时磁盘文件)。特别是-journal
文件是回滚日志。
回滚日志是一个临时文件,用于在SQLite中实现原子提交和回滚功能。(关于这是如何工作的详细讨论,请参阅标题为Atomic Commit In SQLite的单独文档-期刊";附件。
回滚日志通常在事务首次启动时创建,通常在事务提交或回滚时删除。回滚日志文件对于实现SQLite的原子提交和回滚功能至关重要。如果没有回滚日志,SQLite将无法回滚不完整的事务,并且如果在事务中间发生崩溃或断电,那么如果没有回滚日记,整个数据库可能会损坏。
通常,这些-journal
文件应该只在有一个打开的SQLite数据库时存在,或者更确切地说,是一个正在运行的事务,但可以通过PRAGMA journal_mode进行控制。使用默认的杂注设置,-journal
文件将被删除。
DELETE日志记录模式是正常行为。在DELETE模式中,回滚日志在每个事务结束时被删除。实际上,删除操作是导致事务提交的操作。
当数据库未打开并且SQLite本身已删除(或清除)所有日志时,请确保仅复制实际的数据库文件;这意味着所有事务都已完成,数据库处于一致状态。
DB-JOURNAL文件是由SQLite数据库管理系统在应用程序和数据库之间的事务处理过程中创建的临时数据库文件。它包含一个回滚日志,这是一个临时数据库,用于存储数据库的最新状态。
这个问题解决了吗?我有一个案例,我无法从android设备复制我想在本地机器上复制的.db。我必须手动删除设备上的-日志才能成功复制.db。这是我用C#编写的代码
var devices = MediaDevice.GetDevices();
using (var device = devices.First(d => d.Description == "PM67"))
{
device.Connect();
var photoDir = device.GetDirectoryInfo(@"Internal Shared StorageDatabases");
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 StorageDatabasesdatabase.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();
}