2014-10-06 18 views
17

Trong thư mục cơ sở dữ liệu của ứng dụng andoid của tôi (/data/data/com.me.myApp/databases), đối với mỗi cơ sở dữ liệu sqlite tôi tạo, có một cơ sở dữ liệu tương ứng cùng tên với "-journal" được thêm vào tên của nó.Cơ sở dữ liệu SQLite "-journal" trong Android là gì?

ví dụ: myDatabase, myDatabase-tạp chí, myOtherDatabase.db, myOtherDatabase.db-tạp chí

này là gì?

Nếu tôi cung cấp cơ sở dữ liệu điền sẵn cho ứng dụng của tôi (theo: http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/) tôi cần phải bao gồm những cũng '?

Trả lời

16

Chẳng hạn -journal tệp không cần (và nên không) được phân phối.

Điều này là do các tệp nhật ký khác nhau đại diện cho dữ liệu tạm thời (ref. SQLite's Use Of Temporary Disk Files) được SQLite sử dụng. Cụ thể, tệp -journaltạp chí rollback.

Nhật ký cuộn lùi là tệp tạm thời được sử dụng để triển khai các khả năng commit và rollback nguyên tử trong SQLite. (Đối với một cuộc thảo luận chi tiết về cách thức hoạt động này, xem tài liệu riêng biệt có tiêu đề Atomic Commit In SQLite.) Nhật ký rollback luôn nằm trong cùng thư mục với tệp cơ sở dữ liệu và có cùng tên với tệp cơ sở dữ liệu ngoại trừ 8 ký tự " -journal "được thêm vào.

Tạp chí rollback thường được tạo ra khi một giao dịch là lần đầu tiên bắt đầu và thường được xóa khi một giao dịch cam kết hoặc cuộn lại. Tệp nhật ký rollback là cần thiết để thực hiện các cam kết nguyên tử và khả năng rollback của SQLite. Nếu không có một tạp chí rollback, SQLite sẽ không thể khôi phục lại một giao dịch không đầy đủ, và nếu một vụ tai nạn hoặc mất điện xảy ra ở giữa một giao dịch toàn bộ cơ sở dữ liệu có thể sẽ bị hỏng mà không có một tạp chí rollback.

Nói chung, các -journal file chỉ nên tồn tại khi có một cơ sở dữ liệu SQLite mở - hay đúng hơn, một giao dịch đang chạy - nhưng có thể được điều khiển thông qua PRAGMA journal_mode. Với cài đặt pragma mặc định, các tệp -journal sẽ bị xóa.

Chế độ ghi nhật ký DELETE là hành vi bình thường. Trong chế độ DELETE, tạp chí rollback sẽ bị xóa vào cuối mỗi giao dịch. Thật vậy, thao tác xóa là hành động khiến giao dịch thực hiện.

Hãy chắc chắn để chỉ sao chép các tập tin cơ sở dữ liệu thực tế khi cơ sở dữ liệu là không mở và tất cả các tạp chí đã bị xóa (hoặc xóa) bởi SQLite bản thân; điều này ngụ ý tất cả các giao dịch đã được hoàn thành và cơ sở dữ liệu ở trạng thái nhất quán.

+0

gì nếu file -journal là luôn có mặt và kích thước không tầm thường (ví dụ 30KB), tuy nhiên ứng dụng của một người không được thực hiện bất kỳ hoạt động cơ sở dữ liệu, và không để lại cơ sở dữ liệu mở? – Michael

+1

@Michael Đó là một câu hỏi hay - nhưng tôi sợ nó sẽ được chôn trong bình luận, vì tôi không có câu trả lời kiến ​​thức chuyên môn ngay lập tức. Xem xét việc tạo một câu hỏi SO khác, liên kết với câu hỏi/câu trả lời này (và khác) để trình bày một nền tảng tốt. – user2864740

+1

@Michael Tôi xin lỗi, tôi e rằng tôi đã đến quá muộn ở đây, nhưng tôi có một số thông tin thú vị [ở đây] (http://sandersonforensics.com/forum/content.php?208-Dealing-with -records-found-in-SQLite-Rollback-Các tạp chí). Nó nói rằng khi một giao dịch được cam kết, tiêu đề thường là zeroed. Tại mỗi cam kết, tiêu đề được viết, sau đó các trang được viết, ghi đè nội dung gốc, sau đó chỉ tiêu đề được đánh số 0 khi thành công. Một giải pháp chung để 'làm sạch' (ví dụ: xoá) tệp, nếu một cam kết khác không thực hiện, có thể là thực thi VACUUM trong DB. – Lutarisco

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