Programiranje SQLite-a u drugom udžbeniku C

Ovaj je udžbenik drugi u nizu na programiranje SQLite u C.

SQLite pohranjuje zbirku tablica u jednu datoteku baza podataka, obično završava na .db. Svaka je tablica poput proračunske tablice, sastoji se od broja stupaca i svaki red ima vrijednosti.

Ako pomaže, pomislite na svaki red kao na struct, s stupaca u tablici što odgovara poljima u stru.

Tablica može imati onoliko redaka koliko će stati na disk. Postoji gornja granica, ali njegovih ogromnih 18,446,744,073,709,551,616 da budemo precizni.

Tablica može imati do 2.000 stupaca ili ako rekompilirate izvor, možete ga dodati na strašnih 32.767 stupaca.

API SQLite

Za upotrebu SQLitea moramo upućivati ​​pozive prema API-ju. Uvod u ovaj API možete pronaći na službenom mjestu Uvod u SQLite C / C ++ sučelje web stranica. To je skup funkcija i jednostavan za upotrebu.

Prvo, trebamo rukohvat baze podataka. Ovo je tipa sqlite3 i vraća se pozivom na sqlite3_open (naziv datoteke, ** ppDB). Nakon toga izvršimo SQL.

Najprije ćemo imati malu digresiju i stvoriti korisnu bazu podataka i neke tablice koristeći SQLiteSpy. (Pogledajte poveznicu s prethodnim vodičem za vezu do preglednika SQLite baze podataka).

instagram viewer

Događaji i mjesta

Baza podataka o. DB će držati tri tablice za upravljanje događajima na nekoliko mjesta. Ti će događaji biti zabave, diskoteke i koncerti, a odvijat će se na pet mjesta (alfa, beta, charlie, delta i odjek). Kada ovako nešto modelirate, često pomaže započeti s proračunskom tablicom. Radi jednostavnosti, spremit ću samo datum i ne vrijeme.

Proračunska tablica ima tri stupca: datume, mjesto održavanja, vrstu događaja i desetak ovakvih događaja. Termini traju od 21. do 30. lipnja 2013. godine.

Sada SQLite nema izričit tip datuma, pa ga je lakše i brže pohraniti kao int i na isti način na koji Excel koristi datume (dani od 1. siječnja 1900.) imaju int vrijednosti 41446 do 41455. Ako datume stavite u proračunsku tablicu, a potom stupac datuma oblikujte kao broj s 0 decimalnih mjesta, izgleda ovako:

Sada bismo te podatke mogli pohraniti u jednu tablicu i za tako jednostavan primjer, to bi vjerojatno bilo prihvatljivo. Međutim, neke dobre prakse dizajniranja baza podataka zahtijevaju neke normalizacija.

Jedinstvene stavke podataka, kao što su vrsta mjesta, trebaju biti u vlastitoj tablici, a vrste događaja (party itd.) Također trebaju biti u jednoj. Konačno, kako možemo imati više vrsta događaja na više mjesta, (odnos mnogih prema mnogima) trebamo treću tablicu koja ih drži.

Tri su tabele:

  • mjesta održavanja - ima svih pet mjesta
  • eventtypes - sadrži sve tri vrste događaja
  • događaji - sadrži datum plus ID mjesta plus ID vrste događaja. Dodao sam i polje opisa za ovaj događaj, npr. "Jimov rođendan".

Prve dvije tablice sadrže tipove podataka tako da mjesta imaju nazive alfa do odjeka. Dodao sam i cijeli broj id i stvorio indeks za to. S malim brojem mjesta (5) i vrsta događaja (3), to bi se moglo učiniti bez indeksa, ali s većim tablicama doći će vrlo sporo. Stoga svakom stupcu koji se vjerojatno pretražuje dodajte indeks, po mogućnosti cijeli broj

SQL za stvaranje je:

Indeks na tablici događaja ima datum, id-događaj, vrstu događaja i mjesto održavanja. To znači da možemo upitati tablicu događaja za "sve događaje na datumu", "sve događaje na mjestu događaja", "sve zabave" itd. I kombinacije onih kao što su "sve stranke na mjestu događaja" itd.

Nakon pokretanja SQL izrade upita tablice, stvaraju se tri tablice. Napomena Sve sam sql stavio u tekstualnu datoteku create.sql, a uključuje podatke za popunjavanje nekih od tri tablice.

Ako stavite; na kraju redaka kao što sam to učinio u create.sql, tada možete jednokratno izmjeriti i izvršiti sve naredbe. Bez toga; morate svaki pokrenuti sam. U SQLiteSpy samo kliknite F9 da biste pokrenuli sve.

Uključio sam i sql da izbacim sve tri tablice u višeredne komentare pomoću / *.. * / isto kao u C. Samo odaberite tri retka i napravite ctrl + F9 da biste izvršili odabrani tekst.

Ove naredbe ubacuju pet mjesta:

Opet sam uključio komentirani tekst u prazne tablice, uz izbriši iz linije. Nema poništenja, zato budite oprezni s ovim!

Zapanjujuće, uz sve učitane podatke (doduše, ne mnogo), cijela datoteka baze podataka na disku iznosi samo 7KB.

Podaci o događajima

Umjesto da sastavim gomilu deset umetanja izjava, Excel sam koristio za izradu .csv datoteke za podatke događaja a zatim upotrijebite uslužni program naredbenog retka SQLite3 (koji dolazi sa SQLite) i sljedeće naredbe za uvoz to.

Napomena: Svaki redak s prefiksom razdoblja (.) Je naredba. Upotrijebite .help za pregled svih naredbi. Za pokretanje SQL-a samo ga upišite bez prefiksa razdoblja.

Na putu uvoza za svaku mapu morate koristiti dvostruke crne crte \\. Posljednji redak učinite tek nakon što je .import uspio. Kada SQLite3 pokreće zadani separator je: pa ga prije uvoza treba promijeniti u zarez.

Natrag na Kodeks

Sada imamo u potpunosti naseljenu bazu podataka, napišemo C kod pokrenite ovaj SQL upit koji vraća popis stranaka s opisom, datumima i mjestima.

  • Novo u SQL-u? Pročitajte što je SQL?

To čini spajanje koristeći stupac idvenue između tablice događaja i mjesta, tako da dobivamo ime mjesta, a ne vrijednost int idvenue.

Funkcije API-ja SQLite C

Mnogo je funkcija, ali trebamo samo nekoliko. Redoslijed obrade je:

  1. Otvorite bazu podataka sqlite3_open (), izađite ako imate pogreške pri otvaranju.
  2. Pripremite SQL pomoću sqlite3_prepare ()
  3. Petljajte pomoću slqite3_step () dok nema više zapisa
  4. (U petlji) obradite svaki stupac s sqlite3_column ...
  5. Na kraju nazovite sqlite3_close (db)

Postoji dodatni korak nakon poziva sqlite3_prepripremite se gdje su svi parametri proslijeđeni, ali to ćemo spremiti za budući vodič.

Dakle, u programu koji je naveden ispod pseudo koda za glavne korake su:

Sql vraća tri vrijednosti, pa ako je sqlite3.step () == SQLITE_ROW, tada se vrijednosti kopiraju iz odgovarajućih vrsta stupaca. Koristio sam Int i tekst. Datum prikazujem kao broj, ali slobodno ga pretvarajte u datum.

Popis primjera koda