Programovanie SQLite v príručke C

Tento tutoriál je druhým zo série programovanie SQLite v C.

SQLite uloží kolekciu tabuliek do jedného súboru databázy, zvyčajne končiace na .db. Každá tabuľka je ako tabuľka, pozostáva z niekoľkých stĺpcov a každý riadok má hodnoty.

Ak to pomôže, myslite na každý riadok ako na struct, s stĺpce v tabuľke zodpovedajúce poľom v štruktúre.

Tabuľka môže obsahovať toľko riadkov, koľko sa zmestí na disk. Horná hranica je presná, ale jej obrovský počet je 18 446 734 073 709 551 616.

Tabuľka môže obsahovať až 2 000 stĺpcov alebo ak zdroj skompilujete, môžete ho maximalizovať na úžasných 32 767 stĺpcov.

API SQLite

Aby sme mohli používať SQLite, musíme volať do API. Úvod k tomuto API nájdete na oficiálnej stránke Úvod do rozhrania SQLite C / C ++ webstránka. Je to zbierka funkcií a ľahko sa používa.

Najprv potrebujeme popisovač do databázy. Je to typu sqlite3 a vracia sa volaním sqlite3_open (filename, ** ppDB). Potom vykonáme SQL.

Najprv však najprv urobte mierny pokles a pomocou SQLiteSpy vytvorte použiteľnú databázu a niektoré tabuľky. (Odkazy na tento odkaz a SQLite Database Browser nájdete v predchádzajúcom návode).

instagram viewer

Udalosti a miesta konania

Databáza o. DB bude mať tri tabuľky na správu udalostí na viacerých miestach. Tieto podujatia sa budú konať párty, diskotéky a koncerty a uskutočnia sa na piatich miestach (alfa, beta, charlie, delta a echo). Keď niečo podobné modelovate, často vám pomôže začať s tabuľkou. Kvôli jednoduchosti jednoducho uložím dátum, nie čas.

Tabuľka má tri stĺpce: Dátumy, Miesto konania, Typ udalosti a asi desať podobných udalostí. Termíny začínajú od 21. do 30. júna 2013.

Teraz SQLite nemá žiadny explicitný typ dátumu, takže je ľahšie a rýchlejšie uložiť ho ako int a rovnako ako Excel používa dátumy (dni od 1. januára 1900) má int hodnoty 41446 až 41455. Ak zadáte dátum do tabuľky a potom naformátujete stĺpec dátumu ako číslo s 0 desatinnými miestami, vyzerá to takto:

Teraz by sme mohli tieto údaje uložiť do jednej tabuľky a pre taký jednoduchý príklad by to bolo pravdepodobne prijateľné. Dobrá prax pri navrhovaní databázy však niektoré vyžaduje normalizácie.

Jedinečné údajové položky, ako je typ miesta, by mali byť vo svojej vlastnej tabuľke a typy udalostí (párty atď.) By tiež mali byť v jednej. Nakoniec, keďže môžeme mať viac typov udalostí na viacerých miestach ((vzťah medzi mnohými a mnohými), potrebujeme tretiu tabuľku, aby sme ich mohli udržať.

Tieto tri tabuľky sú:

  • miesta - drží všetkých päť miest
  • eventtypes - obsahuje všetky tri typy udalostí
  • udalosti - obsahuje dátum plus ID miesta konania plus ID typu udalosti. Pridal som tiež popisné pole pre túto udalosť, napr. „Jimove narodeniny“.

Prvé dve tabuľky obsahujú typy údajov, takže miesta majú názvy alfa na ozvenu. Pridal som tiež celé číslo a vytvoril som pre to index. Pri malom počte miest (5) a typov udalostí (3) by sa to dalo urobiť bez indexu, ale pri väčších tabuľkách bude veľmi pomalý. Do každého stĺpca, ktorý bude pravdepodobne vyhľadávaný, pridajte index, najlepšie celé číslo

SQL na vytvorenie tohto je:

Index v tabuľke udalostí obsahuje dátum, id-udalosť, typ udalosti a miesto konania. To znamená, že môžeme vyhľadať tabuľku udalostí pre „všetky udalosti v deň“, „všetky udalosti na mieste konania“, „všetky strany“ atď. A kombinácie tých, ako napríklad „všetky strany na mieste konania“ atď.

Po spustení dotazov SQL na vytvorenie tabuľky sa vytvoria tri tabuľky. Poznámka: Do textového súboru create.sql som vložil všetko sql a obsahuje údaje na vyplnenie niektorých z troch tabuliek.

Ak dáte; na konci riadkov, ako som to urobil v create.sql, potom môžete dávkové a vykonávať všetky príkazy naraz. Bez; musíte každý spustiť sám. V SQLiteSpy stačí kliknúť na F9 a spustiť všetko.

Zahrnul som aj sql na vyradenie všetkých troch tabuliek z viacriadkových poznámok pomocou / *.. * / rovnaké ako v C. Stačí vybrať tri riadky a vykonať kombináciu klávesov ctrl + F9 na vykonanie vybraného textu.

Tieto príkazy vkladajú päť miest:

Opäť som zahrnul komentovaný text do prázdnych tabuliek odstrániť z linky. Neexistuje žiadny krok späť, takže buďte opatrní s týmito!

Je úžasné, že so všetkými načítanými údajmi (nie príliš) je celý databázový súbor na disku iba 7 kB.

Údaje o udalosti

Namiesto toho, aby som vytvoril veľa desiatich príkazov na vloženie, použil som Excel na vytvorenie súboru .csv pre údaje o udalostiach a potom na import použil pomôcku príkazového riadka SQLite3 (ktorá sa dodáva s SQLite) a nasledujúce príkazy ono.

Poznámka: Každý riadok s predponou obdobia (.) Je príkaz. Na prezeranie všetkých príkazov použite .help. Ak chcete spustiť SQL, jednoducho ho napíšte bez predpony obdobia.

Musíte použiť dvojité čierne lomky \\ v ceste importu pre každý priečinok. Posledný riadok vykonajte až po úspešnom zavedení súboru .import. Keď SQLite3 beží, predvolený oddeľovač je:, takže musí byť pred importom zmenený na čiarku.

Späť na Kódex

Teraz máme plne obývanú databázu, napíšme C kód na spustenie tohto dotazu SQL, ktorý vracia zoznam strán s popisom, dátumami a miestami konania.

  • Ste novým v SQL? Prečítajte si Čo je SQL?

Tým sa vytvorí spojenie pomocou stĺpca idvenue medzi tabuľkou udalostí a miest, takže dostaneme názov miesta, nie jeho hodnotu int idvenue.

Funkcie rozhrania API SQLite C

Existuje veľa funkcií, ale potrebujeme iba hŕstku. Poradie spracovania je:

  1. Otvorte databázu s sqlite3_open (), ukončite ju, ak sa pri jej otváraní vyskytla chyba.
  2. Pripravte SQL s sqlite3_prepare ()
  3. Slučky pomocou slqite3_step (), kým už nebudú žiadne ďalšie záznamy
  4. (V cykle) spracujte každý stĺpec pomocou sqlite3_column ...
  5. Nakoniec zavolajte sqlite3_close (db)

Po volaní sqlite3_prepare je voliteľný krok, kde sú viazané všetky odovzdané parametre, ale toto si uložíme do budúceho tutoriálu.

Takže v programe uvedenom nižšie je pseudo kód pre hlavné kroky:

Sql vráti tri hodnoty, takže ak sqlite3.step () == SQLITE_ROW, hodnoty sa skopírujú z príslušných typov stĺpcov. Použil som int a text. Dátum zobrazujem ako číslo, ale neváhajte ho previesť na dátum.

Zoznam vzorového kódu