2009-03-11 23 views
26

Tôi bắt đầu nhận thấy một hành vi kỳ lạ với các truy vấn SQLite cho ứng dụng iPhone của mình. Bất cứ khi nào tôi thực thi câu lệnh "INSERT", một tệp nhật ký được tạo bên cạnh tệp db của tôi (tên tệp chính xác là "userdata.db-journal").Điều gì gây ra một tệp nhật ký được tạo trong SQLite?

Nếu tôi hiểu tài liệu chính xác, tệp nhật ký này được SQLite sử dụng để có thể khôi phục trong trường hợp thao tác không thành công. Nhưng tệp vẫn ở đó sau khi thao tác hoàn tất.

tôi làm các bước cổ điển để chuẩn bị, ràng buộc và thực hiện truy vấn (không kiểm tra các giá trị trả lại cho đơn giản):

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); 

Các tập tin tạp chí được tạo ra sau khi các chức năng 'sqlite3_step' được gọi là và vẫn có cho đến khi tôi đóng db. Tôi cần làm gì để làm cho nó biến mất?

Trả lời

24

SQLite theo mặc định tạo ra các tập tin tạp chí tại bắt đầu một giao dịch, đó là một điều tốt. Thông thường nó xóa các tập tin khi cam kết.

Bạn có thể thay đổi hành vi này để chỉ cắt ngắn tệp (không cần tạo/xóa cần thiết) hoặc bằng không, thông qua lệnh sql PRAGMA. Không phải tất cả các tùy chọn đều có thể được hỗ trợ trên phiên bản SQLite của bạn.

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

Thao tác ghi thường không hoàn thành cho đến khi bạn COMMIT, được thực hiện bằng cách cắt xén, xóa hoặc vô hiệu tạp chí. Nếu hành vi này là mới, tôi không giải thích lý do tại sao nó có thể thay đổi, ngoài việc nâng cấp SQLite thay đổi hành vi mặc định, hoặc trở nên phức tạp hơn bằng cách không mở lại tạp chí cho mọi giao dịch.

2

Tại sao bạn muốn?

Tệp nhật ký theo dõi từng giao dịch đến cơ sở dữ liệu; bạn muốn nó để treo xung quanh cho đến khi bạn đóng trình cơ sở dữ liệu, do đó tình trạng DB có thể được xây dựng lại sau khi một vụ tai nạn, ngay cả khi bộ đệm ghi có không ửng đỏ, vv

2

Như Joe đã nói, nhật ký được tạo khi một giao dịch được bắt đầu và SQLlite tạo một giao dịch cho bạn khi bạn bắt đầu một câu lệnh.

để xóa bỏ mọi tạp chí đó và đảm bảo rằng báo cáo kết quả đã cam kết việc sử dụng db:

sqlite3_finalize(insertStmt); 

Trước khi gần bạn.

Tệp .journal sẽ biến mất và tất cả dữ liệu của bạn sẽ đẹp và an toàn trong DB của bạn.

Hy vọng điều này sẽ hữu ích.

chris.

Các vấn đề liên quan