Programarea SQLite în C Tutorial Doi

Acest tutorial este al doilea dintr-o serie despre programarea SQLite în C.

SQLite stochează o colecție de tabele într-o singură bază de date de fișiere, care se termină de obicei în .db. Fiecare tabel este ca o foaie de calcul, este format dintr-un număr de coloane și fiecare rând are valori.

Dacă ajută, gândește-te la fiecare rând ca fiind o structură, cu coloanele din tabel corespunzătoare câmpurilor din struct.

Un tabel poate avea cât mai multe rânduri pe un disc. Există o limită superioară, dar uriașul său 18.446.744.073.709.551.616 este precis.

Un tabel poate avea până la 2.000 de coloane sau dacă recompilați sursa, o puteți maxima la 32.767 coloane minunate.

API-ul SQLite

Pentru a utiliza SQLite, trebuie să apelăm la API. Puteți găsi o introducere la această API pe pagina oficială de introducere a SQLite C / C ++ Interfața. Este o colecție de funcții și ușor de utilizat.

În primul rând, avem nevoie de un mâner pentru baza de date. Acesta este de tip sqlite3 și este returnat printr-un apel către sqlite3_open (nume de fișier, ** ppDB). După aceea, executăm SQL.

Haideți să facem o ușoară digresiune mai întâi și să creăm o bază de date utilizabilă și câteva tabele folosind SQLiteSpy. (Consultați tutorialul anterior pentru link-uri către acesta și browserul de baze de date SQLite).

Evenimente și locuri

Baza de date despre.DB va deține trei tabele pentru a gestiona evenimente în mai multe locuri. Aceste evenimente vor fi petreceri, discoteci și concerte și vor avea loc la cinci locuri (alfa, beta, charlie, delta și ecou). Când modelezi ceva de genul acesta, ajută adesea să începi cu o foaie de calcul. Pentru simplități, voi stoca doar o dată și nu o dată.

Foaia de calcul are trei coloane: date, locație, tip eveniment și aproximativ zece evenimente ca acesta. Datele se desfășoară între 21 și 30 iunie 2013.

Acum, SQLite nu are un tip de date explicit, așa că este mai ușor și mai rapid să îl stochezi ca o int și în același mod în care Excel folosește datele (zile de la 1 ianuarie 1900) au valori int 41446 - 41455. Dacă pui datele într-o foaie de calcul apoi formatați coloana de date ca un număr cu 0 zecimale, arată ceva similar:

Acum am putea stoca aceste date într-un tabel și pentru un exemplu atât de simplu, probabil că ar fi acceptabil. Oricum o bună practică de proiectare a bazelor de date necesită o anumită normalizare.

Elemente de date unice, cum ar fi tipul locului, trebuie să fie în tabelul propriu, iar tipurile de evenimente (petreceri etc.) ar trebui să fie, de asemenea, într-un singur. În cele din urmă, întrucât putem avea mai multe tipuri de evenimente în mai multe locații, (o relație de la mai mulți la mulți) avem nevoie de un al treilea tabel pentru a reține aceste.

Cele trei tabele sunt:

  • locații - deține toate cele cinci locuri
  • tipuri de evenimente - deține toate cele trei tipuri de evenimente
  • evenimente - deține data plus ID-ul locației plus id-ul de tip eveniment. Am adăugat, de asemenea, un câmp de descriere pentru acest eveniment, de exemplu, „Ziua de naștere a lui Jim”.

Primele două tabele conțin tipurile de date, astfel încât locurile au nume alfa la ecou. Am adăugat și un ID întreg și am creat un index pentru asta. Cu numărul mic de locuri (5) și tipuri de evenimente (3), s-ar putea face fără un indice, dar cu tabele mai mari, va deveni foarte lent. Deci, orice coloană care este probabil să fie căutată, adăugați un index, de preferință întreg

SQL pentru a crea acest lucru este:

Indicele de pe tabelul evenimentelor are data, id-evenimentul, tipul evenimentului și locul. Asta înseamnă că putem interoga tabelul de evenimente pentru „toate evenimentele la o dată”, „toate evenimentele de la un loc”, „toate părțile” etc și combinații ale acestora, cum ar fi „toate părțile de la un loc” etc..

După executarea interogărilor de tabel create SQL, cele trei tabele sunt create. Notă Am pus tot acel sql în fișierul text create.sql și include date pentru popularea unora dintre cele trei tabele.

Dacă pui; la sfârșitul liniilor așa cum am făcut în create.sql, atunci puteți lot și executa toate comenzile dintr-o dată. Fara ; trebuie să alergați fiecare de la sine. În SQLiteSpy, trebuie doar să faceți clic pe F9 pentru a rula totul.

Am inclus, de asemenea, sql pentru a arunca toate cele trei tabele din comentarii cu mai multe linii folosind / * ... * / la fel ca în C. Trebuie doar să selectați cele trei linii și să faceți ctrl + F9 pentru a executa textul selectat.

Aceste comenzi inserează cele cinci locuri:

Din nou am inclus text comentat la tabelele goale, cu ștergeți din linii. Nu este nevoie să fiți atenți, așa că aveți grijă cu acestea!

În mod uimitor, cu toate datele încărcate (cu siguranță nu foarte mult), întregul fișier al bazei de date de pe disc este de doar 7 KB.

Date eveniment

În loc să creez o grămadă de zece declarații de inserare, am folosit Excel pentru a crea un fișier .csv pentru datele evenimentului și apoi am folosit utilitatea liniei de comandă SQLite3 (care vine cu SQLite) și următoarele comenzi pentru a o importa.

Notă: Orice linie cu un prefix period (.) Este o comandă. Utilizați .help pentru a vizualiza toate comenzile. Pentru a rula SQL, introduceți-l fără prefix de perioadă.

Trebuie să utilizați durabile negre \\ în calea de import pentru fiecare folder. Numai ultima linie după ce .import a reușit. Când SQLite3 rulează separatorul implicit este: deci trebuie schimbat în virgulă înainte de import.

Înapoi la cod

Acum avem o bază de date complet populată, să scriem codul C pentru a rula această interogare SQL care returnează o listă de părți, cu descriere, date și locații..

  • Nou pentru SQL? Citiți Ce este SQL?

Aceasta face o alăturare folosind coloana de idvenue între tabelul de evenimente și locații, astfel încât să obținem numele locației nu valoarea de int idue..

Funcțiile API SQLite C

Există multe funcții, dar avem nevoie doar de o mână. Ordinea procesării este:

  1. Deschideți baza de date cu sqlite3_open (), ieșiți dacă aveți o eroare la deschiderea acesteia.
  2. Pregătiți SQL cu sqlite3_prepare ()
  3. Buclați-vă folosind slqite3_step () până când nu mai există înregistrări
  4. (În buclă) procesați fiecare coloană cu sqlite3_column ...
  5. În sfârșit, sunați la sqlite3_close (db)

Există un pas opțional după apelarea sqlite3_prepare unde au trecut orice parametri legați, dar îl vom salva pentru un viitor tutorial.

Deci, în programul enumerat mai jos pseudo-cod pentru pașii majori sunt:

Sql returnează trei valori, deci dacă sqlite3.step () == SQLITE_ROW, atunci valorile sunt copiate din tipurile de coloane corespunzătoare. Am folosit int și text. Afișez data ca număr, dar nu mă simt liber să o transform într-o dată.

Listarea codului de exemple