Programmering af SQLite i C Tutorial Two

Denne tutorial er den anden i en serie om programmering SQLite i C.

SQLite gemmer en samling af borde i en enkelt fil database, der normalt slutter på .db. Hver tabel er som et regneark, den består af et antal kolonner, og hver række har værdier.

Hvis det hjælper, skal du tænke på hver række som en struct, med kolonner i tabellen svarende til felterne i strukturen.

En tabel kan have så mange rækker som på en disk. Der er en øvre grænse, men dens enorme 18.446.744.073.709.551.616 for at være præcis.

En tabel kan have op til 2.000 kolonner, eller hvis du genkompilerer kilden, kan du maksimere den til fantastiske 32.767 kolonner.

SQLite API

For at bruge SQLite er vi nødt til at ringe til API'en. Du kan finde en introduktion til denne API på officielle Introduktion til SQLite C / C ++ interface hjemmeside. Det er en samling funktioner og lette at bruge.

Først har vi brug for et håndtag til databasen. Dette er af typen sqlite3 og returneres ved et opkald til sqlite3_open (filnavn, ** ppDB). Derefter udfører vi SQL.

instagram viewer

Lad os først have en let digression og oprette en brugbar database og nogle tabeller ved hjælp af SQLiteSpy. (Se den foregående tutorial for links til den og SQLite-databasebrowser).

Begivenheder og spillesteder

Databasen om. DB vil holde tre borde til at styre begivenheder på flere spillesteder. Disse begivenheder vil være fester, diskoteker og koncerter og finder sted på fem spillesteder (alfa, beta, charlie, delta og ekko). Når du modellerer noget som dette, hjælper det ofte med at starte med et regneark. For enkelheds skyld gemmer jeg bare en dato ikke et tidspunkt.

Regnearket har tre kolonner: Datoer, spillested, begivenhedstype og cirka ti begivenheder som dette. Datoer løber fra 21. til 30. juni 2013.

Nu har SQLite ingen eksplicit datatype, så det er lettere og hurtigere at gemme det som et int og på samme måde som Excel bruger datoer (dage siden 1. januar 1900) har int-værdier 41446 til 41455. Hvis du lægger datoerne i et regneark, så formaterer du datakolonnen som et tal med 0 decimaler, ser det sådan ud:

Nu kunne vi gemme disse data i en tabel, og for et så simpelt eksempel ville det sandsynligvis være acceptabelt. Dog kræver god databasedesignpraksis noget normalisering.

Unikke dataelementer som lokalitetstype skal være i sin egen tabel, og begivenhedstyperne (fest osv.) Skal også være i en. Endelig, da vi kan have flere begivenhedstyper på flere spillesteder, (et forhold mellem mange og mange), har vi brug for en tredje tabel til at afholde disse.

De tre tabeller er:

  • spillesteder - holder alle fem spillesteder
  • begivenhedstyper - indeholder alle tre begivenhedstyper
  • begivenheder - holder datoen plus lokalitet-id plus begivenhedstype-id. Jeg tilføjede også et beskrivelsesfelt til denne begivenhed f.eks. "Jim's Birthday".

De to første tabeller indeholder datatyperne, så spillesteder har alfa-navne til echo. Jeg har også tilføjet et heltal-id og oprettet et indeks til det. Med det lille antal spillesteder (5) og begivenhedstyper (3) kunne det gøres uden et indeks, men med større tabeller vil det komme meget langsomt. Så enhver kolonne, der sandsynligvis vil blive søgt på, tilføj et indeks, helst heltal

SQL til at oprette dette er:

Indekset på begivenhedstabellen har dato, id-begivenhed, begivenhedstype og spillested. Det betyder, at vi kan forespørge om begivenhedstabellen for "alle begivenheder på en dato", "alle begivenheder på et sted", "alle fester" osv. Og kombinationer af dem som "alle fester på et sted" osv.

Efter at have kørt SQL oprette tabelforespørgsler, oprettes de tre tabeller. Bemærk! Jeg har lagt alt det sql i tekstfilen create.sql, og det inkluderer data til udfyldning af nogle af de tre tabeller.

Hvis du lægger; i slutningen af ​​linjerne, som jeg har gjort i create.sql, så kan du batch og udføre alle kommandoer på én gang. Uden; du skal køre hver for sig. I SQLiteSpy skal du bare klikke på F9 for at køre alt.

Jeg har også inkluderet sql for at droppe alle tre tabeller i kommentarer til flere linjer ved hjælp af / *.. * / det samme som i C. Vælg blot de tre linjer og gør ctrl + F9 for at udføre den valgte tekst.

Disse kommandoer indsætter de fem spillesteder:

Igen har jeg inkluderet kommenteret tekst til tomme tabeller med slette fra linjer. Der er ingen fortryd, så vær forsigtig med disse!

Utroligt nok, med alle de indlæste data (ganske vist ikke meget) er hele databasefilen på disken kun 7 KB.

Begivenhedsdata

I stedet for at opbygge en flok af ti indsætningsangivelser, brugte jeg Excel til at oprette en .csv-fil til begivenhedsdata og brugte derefter kommandolinjeværktøjet SQLite3 (der følger med SQLite) og følgende kommandoer til at importere det.

Bemærk: Enhver linje med et præfiks af periode (.) Er en kommando. Brug .help til at se alle kommandoer. For at køre SQL skal du bare indtaste det uden nogen præfiks.

Du skal bruge dobbelt sorte streger \\ i importstien for hver mappe. Gør kun den sidste linje efter .importen er succesrig. Når SQLite3 kører, er standardseparatoren en: så den skal ændres til et komma inden importen.

Tilbage til koden

Nu har vi en fuldt befolket database, lad os skrive C-kode at køre denne SQL-forespørgsel, der returnerer en liste over parter med beskrivelse, datoer og spillesteder.

  • Er du ny på SQL? Læs Hvad er SQL?

Dette gør en sammenføjning ved hjælp af id venekolonnen mellem begivenheder og spillesteder, så vi får navnet på spillestedet ikke dets int idvenue-værdi.

SQLite C API-funktioner

Der er mange funktioner, men vi har kun brug for en håndfuld. Rækkefølgen af ​​behandling er:

  1. Åbn database med sqlite3_open (), afslutt hvis der er en fejl ved åbning af den.
  2. Forbered SQL med sqlite3_prepare ()
  3. Slynge ved hjælp af slqite3_step (), indtil der ikke er flere poster
  4. (I løkken) behandler hver kolonne med sqlite3_column ...
  5. Til sidst ringe til sqlite3_close (db)

Der er et valgfrit trin efter at have ringet til sqlite3_prepare, hvor ethvert givet i parametre er bundet, men vi gemmer det til en fremtidig tutorial.

Så i programmet, der er anført nedenfor, er pseudokoden for de store trin:

Sql returnerer tre værdier, så hvis sqlite3.step () == SQLITE_ROW, kopieres værdierne fra de relevante kolonnetyper. Jeg har brugt int og tekst. Jeg viser datoen som et nummer, men er velkommen til at konvertere den til en dato.

Liste over eksempelkode

instagram story viewer