我开始注意到我的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'函数后创建的,并保持不变直到关闭数据库。我需要做些什么才能让它消失?
答案 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文件将会消失,您的数据库中的所有数据都将非常安全。
希望这有帮助。
克里斯。