Šī apmācība ir otrā sērijā par programmēšana SQLite C.
SQLite vienā failā glabā tabulu kolekciju datu bāze, kas parasti beidzas ar .db. Katra tabula ir kā izklājlapa, tā sastāv no vairākām kolonnām un katrai rindai ir vērtības.
Ja tas palīdz, domājiet par katru rindu kā par būvēt, Ar kolonnas tabulā kas atbilst laukiem būvē.
Tabulā var būt tik daudz rindu, cik ietilps diskā. Ir augšējā robeža, bet, lai precīzi izteiktu, ir milzīgie 18,446,744,073,709,551,616.
Tabulā var būt līdz 2000 kolonnām, vai arī, ja avotu pārkompilējat, varat to maksimāli palielināt līdz lieliskām 32 767 slejām.
SQLite API
Lai izmantotu SQLite, mums jāveic zvani uz API. Šīs API ievads atrodams oficiālajā vietnē Ievads SQLite C / C ++ interfeisā mājas lapa. Tas ir funkciju kopums un ērti lietojams.
Pirmkārt, mums ir nepieciešams datu bāzes rokturis. Tas ir sqlite3 tipa un tiek atgriezts, zvanot uz sqlite3_open (faila nosaukums, ** ppDB). Pēc tam mēs izpildām SQL.
Vispirms vispirms parādīsim nelielu novirzīšanos un izveidosim izmantojamu datu bāzi un dažas tabulas, izmantojot SQLiteSpy. (Saites uz šo un SQLite datu bāzes pārlūku skat. Iepriekšējā apmācībā).
Pasākumi un norises vietas
Datu bāze par. DB būs trīs galdi, lai pārvaldītu pasākumus vairākās norises vietās. Šie pasākumi būs ballītes, diskotēkas un koncerti, un tie notiks piecās vietās (alfa, beta, čārlijs, delta un atbalss). Kad jūs modelējat kaut ko līdzīgu, tas bieži palīdz sākt ar izklājlapu. Vienkāršības labad es saglabāšu datumu, nevis laiku.
Izklājlapā ir trīs kolonnas: Datumi, Norises vieta, Notikuma tips un apmēram desmit šādi notikumi. Datumi ilgst no 2013. gada 21. līdz 30. jūnijam.
Tagad SQLite nav precīza datuma veida, tāpēc ir vieglāk un ātrāk to uzglabāt kā int, tāpat kā Excel izmanto datumus (dienas kopš 1900. gada 1. janvāra), kuru int vērtības ir no 41446 līdz 41455. Ja datumus ievietojat izklājlapā, formatējiet datuma kolonnu kā skaitli ar 0 zīmēm aiz komata, tas izskatās šādi:
Tagad šos datus mēs varētu uzglabāt vienā tabulā, un šādam vienkāršam piemēram tas, iespējams, būtu pieņemams. Tomēr laba datubāzu projektēšanas prakse to prasa normalizēšana.
Unikāliem datu vienumiem, piemēram, norises vietas tipam, vajadzētu būt atsevišķā tabulā, un arī notikumu veidiem (viesību utt.) Vajadzētu būt vienā. Visbeidzot, tā kā mums var būt vairāki notikumu veidi vairākās norises vietās (attiecības no daudziem līdz daudziem), lai tos noturētu, mums ir nepieciešama trešā tabula.
Trīs tabulas ir šādas:
- norises vietas - tur visas piecas norises vietas
- notikumu veidi - satur visus trīs notikumu veidus
- notikumi - tur datumu un norises vietas plus notikuma veida ID. Es šim notikumam pievienoju arī apraksta lauku, piem., "Džima dzimšanas diena".
Pirmās divas tabulas satur datu tipus, tāpēc norises vietām ir nosaukumi, kas atbalsojas pēc burtiem. Esmu pievienojis arī vesela skaitļa ID un tam izveidojis indeksu. Ar nelielu vietu skaitu (5) un pasākumu veidiem (3) to varētu izdarīt bez indeksa, bet ar lielākām tabulām tas notiks ļoti lēni. Tātad jebkurai slejai, kurā, iespējams, tiks meklēta, pievienojiet indeksu, vēlams vesels skaitlis
SQL, lai to izveidotu, ir:
Notikumu tabulas rādītājā ir datums, id-event, notikuma tips un vieta. Tas nozīmē, ka mēs varam vaicāt notikumu tabulā vārdus "visi datuma notikumi", "visi pasākumi norises vietā", "visas ballītes" utt. Un tādu kombināciju kombinācija kā "visas ballītes norises vietā" utt.
Pēc SQL izveidošanas tabulas vaicājumu palaišanas tiek izveidotas trīs tabulas. Piezīme. Visu šo sql esmu ievietojis teksta failā create.sql, un tajā ir iekļauti dati par dažu no trīs tabulu aizpildīšanu.
Ja jūs ievietojat; rindiņu beigās, kā es esmu izdarījis vietnē create.sql, tad jūs varat vienā komandā partijas un izpildīt visas komandas. Bez; jums katram pašam jāskrien. SQLiteSpy vienkārši noklikšķiniet uz F9, lai palaistu visu.
Esmu iekļāvis arī sql, lai nomest visas trīs tabulas daudzrindu komentāros, izmantojot / *.. * / tāds pats kā C. Vienkārši atlasiet trīs līnijas un veiciet taustiņu kombināciju ctrl + F9, lai izpildītu atlasīto tekstu.
Šīs komandas ievieto piecas vietas:
Atkal esmu komentējis tekstu tukšās tabulās ar izdzēst no līnijas. Nav atsaukšanas, tāpēc esiet uzmanīgs ar šiem!
Pārsteidzoši, ka ar visiem ielādētiem datiem (jāatzīst, ka to nav daudz) viss datu bāzes fails diskā ir tikai 7 KB.
Notikumu dati
Tā vietā, lai izveidotu desmit ievietotu paziņojumu kopu, es izmantoju programmu Excel, lai izveidotu .csv failu notikumu datiem un pēc tam importēšanai izmantoja komandrindas utilītu SQLite3 (kas nāk komplektā ar SQLite) un sekojošās komandas tā.
Piezīme: jebkura rinda ar perioda (.) Prefiksu ir komanda. Izmantojiet .help, lai apskatītu visas komandas. Lai palaistu SQL, vienkārši ierakstiet to bez perioda prefiksa.
Katras mapes importēšanas ceļā ir jāizmanto dubultās slīpsvītras \\. Veiciet pēdējo rindiņu tikai pēc tam, kad .import ir izdevies. Kad SQLite3 darbojas, noklusējuma atdalītājs ir: tāpēc pirms importēšanas tas ir jāmaina uz komatu.
Atpakaļ pie koda
Tagad mums ir pilnībā apdzīvota datu bāze, rakstīsim C kods palaist šo SQL vaicājumu, kas atgriež partiju sarakstu ar aprakstu, datumiem un norises vietām.
- Vai esat jauns SQL lietotājs? Izlasiet Kas ir SQL?
Tas notiek, izmantojot notikumu un norises vietu tabulu, izmantojot sleju idvenue, tāpēc mēs iegūstam norises vietas nosaukumu, nevis tās int idvenue vērtību.
SQLite C API funkcijas
Ir daudz funkciju, bet mums ir vajadzīga tikai nedaudz. Apstrādes secība ir šāda:
- Atveriet datu bāzi ar sqlite3_open (), izejiet, ja ir kļūda, atverot to.
- Sagatavojiet SQL, izmantojot sqlite3_prepare ()
- Cilpa, izmantojot slqite3_step (), līdz vairs nav ierakstu
- (Cilpā) apstrādā katru kolonnu ar sqlite3_column ...
- Visbeidzot, zvaniet sqlite3_close (db)
Pēc zvana sqlite3_prepare izsaukšanas ir obligāta darbība, ja visi parametri, kas nodoti parametros, ir piesaistīti, taču mēs to saglabāsim turpmākai apmācībai.
Tātad zemāk uzskaitītajā programmā galveno darbību pseidokods ir:
Sql atgriež trīs vērtības, tāpēc, ja sqlite3.step () == SQLITE_ROW, tad vērtības tiek kopētas no atbilstošajiem kolonnu veidiem. Esmu izmantojis int un tekstu. Es attēloju datumu kā skaitli, bet jūtieties brīvi pārveidot to par datumu.
Koda piemēra uzskaitījums