2009-03-11 23 views
26

मैंने अपने आईफोन एप्लिकेशन के लिए अपने SQLite प्रश्नों के साथ एक अजीब व्यवहार को देखना शुरू कर दिया। जब भी मैं एक "INSERT" कथन निष्पादित करता हूं, मेरी डीबी फ़ाइल के बगल में एक जर्नल फ़ाइल बनाई जाती है (सटीक फ़ाइल नाम "userdata.db-jour" है)।SQLite में जर्नल फ़ाइल बनाने का क्या कारण बनता है?

यदि मैं दस्तावेज़ों को सही ढंग से समझता हूं, तो यह जर्नल फ़ाइल 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' समारोह कहा जाता है और है जर्नल फ़ाइल बनाई गई है वहाँ रहता है:

मैं तैयारी बंधन और क्रियान्वित क्वेरी (सादगी के लिए बदले मूल्यों के लिए कोई भी चेक) के लिए क्लासिक चरण जब तक मैं डीबी बंद नहीं करता। इसे दूर करने के लिए मुझे क्या करने की ज़रूरत है?

उत्तर

24

SQLite डिफ़ॉल्ट रूप से पर पत्रिका फ़ाइल बनाता है एक लेनदेन की शुरुआत, जो एक अच्छी बात है। आम तौर पर यह प्रतिबद्धता पर फ़ाइल हटा देता है।

आप इस व्यवहार को आसानी से फ़ाइल को छीनने के लिए बदल सकते हैं (कोई भी बनाना/हटाएं) या इसे शून्य करने के लिए, PRAGMA sql कमांड के माध्यम से। SQLite के आपके संस्करण पर सभी विकल्प समर्थित नहीं हो सकते हैं।

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

लिखने के ऑपरेशन सामान्य रूप से पूरा नहीं होते हैं जब तक आप COMMIT नहीं करते हैं, जिसे जर्नल को छंटनी, हटाना या अमान्य कर दिया जाता है।

यदि यह व्यवहार नया है, तो मुझे कोई स्पष्टीकरण नहीं है कि यह क्यों बदला जा सकता है, शायद SQLite के अपग्रेड के अलावा डिफ़ॉल्ट व्यवहार बदल गया है, या प्रत्येक लेनदेन के लिए जर्नल को दोबारा खोलकर अधिक परिष्कृत हो गया है।

2

आप क्यों चाहते हैं?

जर्नल फ़ाइल प्रत्येक लेनदेन को डेटा बेस पर ट्रैक रखती है; आप इसके चारों ओर लटका जब तक आप, डेटाबेस को बंद इतना है कि डीबी राज्य एक दुर्घटना के बाद फिर से बनाया जा सकता है, भले ही लिखने बफ़र्स करना चाहते नहीं प्लावित आदि

2

जैसा कि जो ने कहा, एक लेनदेन शुरू होने पर जर्नल बनाया जाता है और जब आप कोई कथन शुरू करते हैं तो SQLlite आपके लिए एक बनाता है।

कि पत्रिका को साफ और यह सुनिश्चित करें कि बयान db उपयोग के लिए प्रतिबद्ध था बनाने के लिए:

sqlite3_finalize(insertStmt); 

इससे पहले कि आपके पास।

.journal फ़ाइल चली जाएगी और आपका सभी डेटा आपके डीबी में अच्छा और सुरक्षित होगा।

उम्मीद है कि इससे मदद मिलती है।

क्रिस।

संबंधित मुद्दे