यह ट्यूटोरियल एक श्रृंखला में दूसरा है प्रोग्रामिंग SQLite सी में.
SQLite किसी एकल फ़ाइल में तालिकाओं का संग्रह संग्रहीत करता है डेटाबेस, आमतौर पर .db में समाप्त होता है। प्रत्येक तालिका एक स्प्रेडशीट की तरह होती है, इसमें कई कॉलम होते हैं और प्रत्येक पंक्ति में मान होते हैं।
यदि यह मदद करता है, तो प्रत्येक पंक्ति को एक होने के रूप में सोचें struct, उसके साथ तालिका में कॉलम संरचना में फ़ील्ड के अनुरूप।
एक तालिका में एक डिस्क पर जितनी पंक्तियाँ होंगी, उतनी हो सकती हैं। इसकी ऊपरी सीमा है लेकिन इसकी विशाल 18,446,744,073,709,551,616 सटीक है।
तालिका में 2,000 कॉलम हो सकते हैं या यदि आप स्रोत को फिर से जोड़ते हैं, तो आप इसे अधिकतम 32,767 कॉलम तक बढ़ा सकते हैं।
SQLite एपीआई
SQLite का उपयोग करने के लिए, हमें API पर कॉल करने की आवश्यकता है। आप आधिकारिक पर इस एपीआई का परिचय पा सकते हैं SQLite C / C ++ इंटरफ़ेस का परिचय वेब पृष्ठ। यह कार्यों का संग्रह है और उपयोग में आसान है।
सबसे पहले, हमें डेटाबेस को हैंडल की आवश्यकता है। यह sqlite3 का प्रकार है और sqlite3_open (फ़ाइल नाम, ** ppDB) पर कॉल करके लौटाया जाता है। उसके बाद, हम निष्पादित करते हैं एसक्यूएल.
आइए पहले थोड़ा सा विषयांतर करें, हालांकि SQLiteSpy का उपयोग करके एक प्रयोग करने योग्य डेटाबेस और कुछ तालिकाओं का निर्माण करें। (उस और SQLite डेटाबेस ब्राउज़र के लिंक के लिए पिछले ट्यूटोरियल देखें)।
घटनाओं और स्थानों
डेटाबेस के बारे में। DB कई स्थानों पर घटनाओं का प्रबंधन करने के लिए तीन तालिकाओं का आयोजन करेगा। ये कार्यक्रम पार्टियां, डिस्को और संगीत कार्यक्रम होंगे और पांच स्थानों (अल्फा, बीटा, चार्ली, डेल्टा और इको) में होंगे। जब आप कुछ इस तरह से मॉडलिंग कर रहे होते हैं, तो यह अक्सर स्प्रेडशीट के साथ शुरू करने में मदद करता है। सरलता के लिए, मैं सिर्फ एक तारीख को स्टोर करूँगा, समय नहीं।
स्प्रेडशीट में तीन कॉलम हैं: डेट, वेन्यू, इवेंट टाइप और लगभग दस इवेंट जैसे। दिनांक 21 से 30 जून 2013 तक चलते हैं।
अब SQLite के पास कोई स्पष्ट तिथि प्रकार नहीं है, इसलिए इसे इंट के रूप में संग्रहीत करना आसान और तेज़ है और उसी तरह जैसे कि एक्सेल तारीखों का उपयोग करता है (1 जनवरी, 1900 के बाद के दिन) में 41446 से 41455 के अंतर मान हैं। यदि आप तिथियों को एक स्प्रेडशीट में रखते हैं तो दिनांक स्तंभ को 0 दशमलव स्थानों वाली संख्या के रूप में प्रारूपित करें, यह कुछ इस तरह दिखता है:
अब हम इस डेटा को एक तालिका में संग्रहीत कर सकते हैं और इस तरह के एक सरल उदाहरण के लिए, यह शायद स्वीकार्य होगा। हालाँकि अच्छे डेटाबेस डिज़ाइन अभ्यास के लिए कुछ की आवश्यकता होती है मानकीकरण.
स्थल प्रकार जैसे अद्वितीय डेटा आइटम अपनी तालिका में होने चाहिए और ईवेंट प्रकार (पार्टी आदि) भी एक में होने चाहिए। अंत में, चूंकि हमारे पास कई स्थानों पर कई प्रकार के कार्यक्रम हो सकते हैं, (कई से कई संबंध) हमें इन्हें धारण करने के लिए एक तीसरी तालिका की आवश्यकता होती है।
तीन तालिकाओं हैं:
- स्थानों - सभी पांच स्थानों को धारण करता है
- Eventtypes - सभी तीन प्रकार की घटनाओं को रखती है
- ईवेंट - आयोजन के लिए प्लस प्लस ईवेंट आईडी प्लस ईवेंट आईडी। मैंने इस घटना के लिए एक विवरण फ़ील्ड भी जोड़ा है जैसे "जिम का जन्मदिन"।
पहले दो तालिकाओं में डेटा प्रकार होते हैं, इसलिए वेन्यू में अल्फा से लेकर इको तक नाम होते हैं। मैंने एक पूर्णांक आईडी भी जोड़ा है और उसके लिए एक सूचकांक बनाया है। स्थानों की छोटी संख्या (5) और घटना प्रकार (3) के साथ, यह एक सूचकांक के बिना किया जा सकता है, लेकिन बड़ी तालिकाओं के साथ, यह बहुत धीमा हो जाएगा। इसलिए किसी भी कॉलम को खोजा जाना संभव है, एक इंडेक्स, अधिमानतः पूर्णांक जोड़ें
इसे बनाने के लिए SQL है:
ईवेंट टेबल पर इंडेक्स में दिनांक, आईडी-ईवेंट, ईवेंट प्रकार और स्थल है। इसका मतलब है कि हम "किसी तिथि पर सभी कार्यक्रम", "किसी स्थान पर सभी कार्यक्रम", "सभी पार्टियों" आदि के लिए ईवेंट टेबल को क्वेरी कर सकते हैं और जैसे कि "किसी स्थान पर सभी पार्टी" आदि का संयोजन।
SQL बनाने के बाद तालिकाएँ बनाएँ, तीन तालिकाएँ बनाई गई हैं। नोट मैंने वह सभी sql टेक्स्ट फ़ाइल create.sql में डाल दिया है और इसमें तीन तालिकाओं में से कुछ को पॉप्युलेट करने के लिए डेटा शामिल है।
यदि आप डालते हैं; लाइनों के अंत में जैसा कि मैंने create.sql में किया है तब आप एक ही बार में सभी कमांड को बैच और निष्पादित कर सकते हैं। के बिना; आपको हर एक को अपने आप चलाना होगा। SQLiteSpy में, सब कुछ चलाने के लिए F9 क्लिक करें।
मैंने / * का उपयोग करते हुए मल्टी-लाइन टिप्पणियों के अंदर सभी तीन तालिकाओं को छोड़ने के लिए sql को भी शामिल किया है। * / उसी के रूप में सी। बस तीन पंक्तियों का चयन करें और चयनित पाठ को निष्पादित करने के लिए ctrl + F9 करें।
ये आदेश पाँच स्थानों को सम्मिलित करते हैं:
फिर से मैंने खाली तालिकाओं के लिए पाठ को शामिल किया है, के साथ से हटा दें लाइनों। कोई पूर्ववत नहीं है इसलिए इनसे सावधान रहें!
आश्चर्यजनक रूप से, सभी डेटा लोड किए गए (आमतौर पर ज्यादा नहीं) डिस्क पर संपूर्ण डेटाबेस फ़ाइल केवल 7KB है।
इवेंट डेटा
दस इंसर्ट स्टेटमेंट का एक समूह बनाने के बजाय, मैंने एक्सेल का उपयोग इवेंट डेटा के लिए एक .csv फ़ाइल बनाने के लिए किया और फिर SQLite3 कमांड लाइन उपयोगिता (जो SQLite के साथ आता है) और आयात करने के लिए निम्न आदेशों का उपयोग किया यह।
नोट: किसी भी लाइन की अवधि (।) के साथ उपसर्ग एक कमांड है। सभी आदेशों को देखने के लिए .help का उपयोग करें। SQL चलाने के लिए इसे केवल बिना किसी अवधि उपसर्ग के टाइप करें।
आपको प्रत्येक फ़ोल्डर के लिए आयात पथ में डबल ब्लैकस्लैश \\ का उपयोग करना होगा। .Import सफल होने के बाद ही अंतिम पंक्ति में आते हैं। जब SQLite3 डिफ़ॉल्ट विभाजक चलाता है: a है, इसलिए इसे आयात से पहले अल्पविराम में बदलना होगा।
कोड पर वापस जाएं
अब हमारे पास पूरी तरह से आबादी वाला डेटाबेस है, आइए लिखते हैं सी कोड इस SQL क्वेरी को चलाने के लिए, जो विवरण, दिनांक और स्थानों के साथ पार्टियों की सूची लौटाती है।
- SQL के लिए नया है? पढ़ें क्या है एसक्यूएल?
यह ईवेंट और वेन्यू टेबल के बीच के आयतन कॉलम का उपयोग करते हुए जुड़ता है, इसलिए हमें आयोजन स्थल का नाम नहीं मिलता है, न ही इसका इंट आइडियल वैल्यू।
SQLite C API फ़ंक्शंस
कई कार्य हैं लेकिन हमें केवल एक मुट्ठी भर की आवश्यकता है। प्रसंस्करण का क्रम है:
- Sqlite3_open () के साथ खुला डेटाबेस, इसे खोलने में त्रुटि होने पर बाहर निकलें।
- SQLlite3_prepare () के साथ SQL तैयार करें
- कोई और रिकॉर्ड नहीं होने तक slqite3_step () का उपयोग करके लूप करें
- (लूप में) sqlite3_column के साथ प्रत्येक कॉलम को प्रोसेस करें ...
- अंत में कॉल sqlite3_close (db)
Sqlite3_prepare पर कॉल करने के बाद एक वैकल्पिक कदम है, जहां कोई भी पैरामीटर बाध्य है, लेकिन हम भविष्य के ट्यूटोरियल के लिए इसे बचाएंगे।
तो प्रमुख चरणों के लिए छद्म कोड के नीचे सूचीबद्ध कार्यक्रम में हैं:
Sql तीन मान लौटाता है यदि sqlite3.step () == SQLITE_ROW तो मान उपयुक्त स्तंभ प्रकारों से कॉपी किए जाते हैं। मैंने int और text का उपयोग किया है। मैं तारीख को एक संख्या के रूप में प्रदर्शित करता हूं लेकिन इसे एक तारीख में बदलने के लिए स्वतंत्र महसूस करता हूं।
उदाहरण कोड की लिस्टिंग