是什么原因导致在SQLite中创建日志文件?

时间:2009-03-11 03:56:20

标签: iphone sqlite

我开始注意到我的iPhone应用程序的SQLite查询有一种奇怪的行为。每当我执行“INSERT”语句时,都会在我的db文件旁边创建一个日志文件(确切的文件名是“userdata.db-journal”)。

如果我正确理解文档,SQLite将使用此日志文件在操作失败时能够回滚。但是在操作完成后文件仍保留在那里。

我执行准备,绑定和执行查询的经典步骤(为简单起见,不检查返回值):

sqlite3 *db = NULL;
sqlite3_open( "userdata.db", &db );

sqlite3_stmt *insertStmt = NULL;
const char *query = "INSERT INTO table VALUES(?,?)";
sqlite3_prepare_v2( db, query, -1, &insertStmt, NULL );

sqlite3_bind_int( insertStmt, 1, 0 );
sqlite3_bind_int( insertStmt, 2, 0 );

sqlite3_step( insertStmt );

sqlite3_reset( insertStmt );
sqlite3_clear_bindings( insertStmt );

sqlite3_close( db );

日志文件是在调用'sqlite3_step'函数后创建的,并保持不变直到关闭数据库。我需要做些什么才能让它消失?

3 个答案:

答案 0 :(得分:24)

SQLite默认情况下会在事务开始时创建日志文件,这是一件好事。通常它会在提交时删除文件。

您可以通过PRAGMA sql命令更改此行为以简单地截断文件(无需创建/删除)或将其归零。您的SQLite版本可能不支持所有选项。

PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF  

写入操作通常在您执行COMMIT之前未完成,这是通过截断,删除或使日记失效来实现的。

如果这个行为是新的,我没有解释为什么它可能会发生变化,除了可能是SQLite的升级改变了默认行为,或者因为没有为每个事务重新打开日志而变得更加复杂。

答案 1 :(得分:2)

你为什么这么想?

日志文件跟踪数据库中的每个事务;你希望它在你关闭数据库之前一直闲逛,这样即使写缓冲区没有刷新等,也可以在崩溃后重建DB状态。

答案 2 :(得分:2)

正如Joe所说,日志是在事务启动时创建的,而SQLlite在您开始声明时为您创建了一个日志。

清除该日志并确保该语句已提交给db using:

sqlite3_finalize(insertStmt);   

在你结束之前。

.journal文件将会消失,您的数据库中的所有数据都将非常安全。

希望这有帮助。

克里斯。