我开始注意到我的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'函数后创建的,并保持不变直到关闭数据库.我需要做些什么才能让它消失?
SQLite默认在事务开始时创建日志文件,这是一件好事.通常它会在提交时删除文件.
您可以通过PRAGMA sql命令更改此行为以简单地截断文件(无需创建/删除)或将其归零.您的SQLite版本可能不支持所有选项.
PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF
写操作通常直到您执行COMMIT才能完成,这是通过截断,删除或使日志无效来实现的.
如果这种行为是新的,我没有解释为什么它可能已经改变,除了可能是SQLite的升级改变了默认行为,或者因为没有为每个事务重新打开日志而变得更加复杂.