مثير للإعجاب

برمجة SQLite في C البرنامج التعليمي الثاني

برمجة SQLite في C البرنامج التعليمي الثاني

هذا البرنامج التعليمي هو الثاني في سلسلة حول برمجة SQLite في C.

SQLite يخزن مجموعة من الجداول في قاعدة بيانات ملف واحد ، وعادة ما تنتهي في .db. يشبه كل جدول جدول بيانات ، ويتكون من عدد من الأعمدة ولكل صف قيم.

إذا كان ذلك مفيدًا ، فكر في كل صف على أنه بنية ، حيث تتوافق الأعمدة الموجودة في الجدول مع الحقول الموجودة في الهيكل.

يمكن أن يحتوي الجدول على أكبر عدد ممكن من الصفوف على القرص. يوجد حد أعلى ولكن 18666.744.073.7709551.616 ضخم.

يمكن أن يحتوي الجدول على ما يصل إلى 2000 عمود أو إذا قمت بإعادة ترجمة المصدر ، يمكنك رفعه إلى 32767 عمودًا رائعًا.

واجهة برمجة تطبيقات SQLite

لاستخدام SQLite ، نحتاج إلى إجراء مكالمات إلى API. يمكنك العثور على مقدمة لواجهة برمجة التطبيقات هذه على صفحة الويب الرسمية لمقدمة SQLite C / C ++. إنها مجموعة من الوظائف وسهلة الاستخدام.

أولاً ، نحتاج إلى قاعدة بيانات. هذا من النوع sqlite3 ويتم إرجاعه عن طريق مكالمة إلى sqlite3_open (اسم الملف ، ** ppDB). بعد ذلك ، نقوم بتنفيذ SQL.

دعنا نحصل على استطراد بسيط أولاً وأنشئ قاعدة بيانات قابلة للاستخدام وبعض الجداول باستخدام SQLiteSpy. (انظر البرنامج التعليمي السابق للحصول على روابط لذلك ومتصفح قاعدة بيانات SQLite).

أحداث و أماكن

ستحتفظ قاعدة البيانات about.DB بثلاثة جداول لإدارة الأحداث في أماكن متعددة. ستكون هذه الأحداث بمثابة الحفلات والمراقص والحفلات الموسيقية وستقام في خمسة أماكن (ألفا وبيتا وتشارلي ودلتا وصدى). عندما تقوم بتصميم نماذج من هذا القبيل ، فغالبًا ما يساعد ذلك في البدء بجدول بيانات. من أجل البساطة ، سأقوم فقط بتخزين موعد وليس وقت.

يحتوي جدول البيانات على ثلاثة أعمدة: التواريخ والمكان ونوع الحدث وحوالي عشرة أحداث مثل هذه. تبدأ التواريخ من 21 إلى 30 يونيو 2013.

الآن لا يحتوي SQLite على نوع تاريخ صريح ، لذلك من الأسهل والأسرع تخزينه على أنه int وبنفس الطريقة التي يستخدمها Excel للتواريخ (الأيام منذ 1 يناير 1900) لها قيم int من 41446 إلى 41455. إذا وضعت التواريخ في جدول بيانات ثم تنسيق عمود التاريخ كرقم مع 0 المنازل العشرية ، يبدو مثل هذا:

الآن يمكننا تخزين هذه البيانات في جدول واحد ، وعلى سبيل المثال البسيط ، قد يكون ذلك مقبولًا. لكن الممارسة الجيدة لتصميم قواعد البيانات تتطلب بعض التطبيع.

يجب أن تكون عناصر البيانات الفريدة مثل نوع المكان في جدولها الخاص وأن تكون أنواع الأحداث (الحفلات وغيرها) في جدول واحد. أخيرًا ، نظرًا لأنه يمكن أن يكون لدينا أنواع أحداث متعددة في أماكن متعددة ، (من علاقة كثير إلى كثير) ، نحتاج إلى جدول ثالث للاحتفاظ بها.

الجداول الثلاثة هي:

  • أماكن - يحمل جميع الأماكن الخمسة
  • أنواع الأحداث - يحمل جميع أنواع الأحداث الثلاثة
  • الأحداث - يحمل معرف تاريخ المكان بالإضافة إلى معرف نوع الحدث. أضفت أيضًا حقل وصف لهذا الحدث ، على سبيل المثال "عيد ميلاد جيم".

يحتفظ الجدولان الأوليان بأنواع البيانات بحيث تحتوي الأماكن على أسماء ألفا للتردد. لقد أضفت رقمًا صحيحًا أيضًا وأنشأت فهرسًا لذلك. مع وجود عدد صغير من الأماكن (5) وأنواع الأحداث (3) ، يمكن القيام بذلك بدون فهرس ، ولكن مع وجود جداول أكبر ، سيصبح بطيئًا للغاية. لذلك أي عمود من المحتمل البحث فيه ، أضف فهرسًا ، ويفضل أن يكون عددًا صحيحًا

SQL لإنشاء هذا:

يحتوي الفهرس الموجود في جدول الأحداث على التاريخ والحدث المعرف ونوع الحدث والمكان. هذا يعني أنه يمكننا الاستعلام عن جدول الأحداث "لجميع الأحداث في تاريخ" ، "جميع الأحداث في مكان ما" ، "جميع الأطراف" وما إلى ذلك ومجموعات من مثل "جميع الأطراف في مكان ما" ، إلخ.

بعد تشغيل SQL إنشاء استعلامات الجدول ، يتم إنشاء الجداول الثلاثة. ملاحظة لقد وضعت كل ذلك sql في ملف نصي create.sql ويتضمن بيانات لملء بعض الجداول الثلاثة.

إذا وضعت ؛ في نهاية الأسطر كما فعلت في create.sql ، يمكنك بعد ذلك تنفيذ جميع الأوامر دفعة واحدة وتنفيذها. بدون ال ؛ عليك ان تدير كل منها بمفرده. في SQLiteSpy ، فقط انقر فوق F9 لتشغيل كل شيء.

لقد قمت أيضًا بتضمين sql لإسقاط جميع الجداول الثلاثة داخل التعليقات متعددة الأسطر باستخدام / * ... * / كما في C. فقط حدد الأسطر الثلاثة وقم ctrl + F9 لتنفيذ النص المحدد.

تدرج هذه الأوامر الأماكن الخمسة:

مرة أخرى لقد قمت بتعليق نص التعليق على جداول فارغة ، مع حذف من خطوط. ليس هناك تراجع لذا كن حذرا مع هؤلاء!

بشكل مثير للدهشة ، مع تحميل جميع البيانات (لا يُعترف كثيرًا) ، فإن ملف قاعدة البيانات بأكمله على القرص لا يتجاوز 7 كيلو بايت.

بيانات الحدث

بدلاً من إنشاء مجموعة من عشرة عبارات إدراج ، استخدمت Excel لإنشاء ملف بتنسيق .csv لبيانات الأحداث ، ثم استخدمت الأداة المساعدة لسطر الأوامر SQLite3 (التي تأتي مع SQLite) والأوامر التالية لاستيرادها.

ملاحظة: أي سطر مع بادئة النقطة (.) هو أمر. استخدم. help لعرض كل الأوامر. لتشغيل SQL ، اكتبه فقط بدون بادئة فترة.

يجب عليك استخدام blackslashes في مسار الاستيراد لكل مجلد. افعل فقط السطر الأخير بعد نجاح الاستيراد. عند تشغيل SQLite3 يكون الفاصل الافتراضي هو: لذلك يجب تغييره إلى فاصلة قبل الاستيراد.

العودة إلى الرمز

الآن لدينا قاعدة بيانات مكتظة بالكامل ، دعنا نكتب كود C لتشغيل استعلام SQL الذي يعرض قائمة الأطراف ، مع الوصف والتواريخ والأماكن.

  • جديد على SQL؟ قراءة ما هو SQL؟

يقوم هذا بربط باستخدام عمود idvenue بين جدول الفعاليات والأماكن حتى نحصل على اسم المكان وليس قيمته id idven.

وظائف SQLite C API

هناك العديد من الوظائف ولكننا بحاجة فقط إلى حفنة. ترتيب المعالجة هو:

  1. فتح قاعدة البيانات مع sqlite3_open () ، والخروج إذا كان لديك خطأ فتحه.
  2. تحضير SQL مع sqlite3_prepare ()
  3. حلقة باستخدام slqite3_step () حتى لا مزيد من السجلات
  4. (في الحلقة) معالجة كل عمود مع sqlite3_column ...
  5. أخيرًا اتصل بـ sqlite3_close (db)

هناك خطوة اختيارية بعد استدعاء sqlite3_prepare حيث يتم ربط أي معلمات تم تمريرها ، لكننا سنوفر ذلك لبرنامج تعليمي في المستقبل.

لذلك في البرنامج المذكور أدناه الكود الزائف للخطوات الرئيسية هي:

تقوم دالة sql بإرجاع ثلاث قيم ، لذا إذا كانت sqlite3.step () == SQLITE_ROW ، فسيتم نسخ القيم من أنواع الأعمدة المناسبة. لقد استخدمت كثافة العمليات والنص. أعرض التاريخ كرقم ولكن لا تتردد في تحويله إلى تاريخ.

سرد رمز المثال