Questo tutorial è il secondo di una serie sulla programmazione di SQLite in C.
SQLite memorizza una raccolta di tabelle in un unico database di file, che di solito termina in .db. Ogni tabella è come un foglio di calcolo, è composta da un numero di colonne e ogni riga ha valori.
Se aiuta, pensa a ciascuna riga come a una struttura, con le colonne nella tabella corrispondenti ai campi nella struttura.
Una tabella può avere tutte le righe che si adatteranno su un disco. C'è un limite superiore ma i suoi enormi 18.446.744.073.709.551.616 per la precisione.
Una tabella può avere fino a 2.000 colonne o se ricompili l'origine, puoi maxarla in un fantastico 32.767 colonne.
Per utilizzare SQLite, dobbiamo effettuare chiamate all'API. È possibile trovare un'introduzione a questa API nella pagina Web ufficiale Introduzione all'interfaccia SQLite C / C ++. È una raccolta di funzioni e facile da usare.
Innanzitutto, è necessario un handle per il database. Questo è di tipo sqlite3 ed è restituito da una chiamata a sqlite3_open (nome file, ** ppDB). Successivamente, eseguiamo l'SQL.
Facciamo prima una leggera digressione e creiamo un database utilizzabile e alcune tabelle usando SQLiteSpy. (Vedi il tutorial precedente per i collegamenti a questo e al browser del database SQLite).
Il database about.DB conterrà tre tabelle per gestire gli eventi in diverse sedi. Questi eventi saranno feste, discoteche e concerti e si svolgeranno in cinque sedi (alfa, beta, charlie, delta ed eco). Quando modelli qualcosa del genere, spesso aiuta a iniziare con un foglio di calcolo. Per motivi di semplicità, memorizzerò solo una data, non un'ora.
Il foglio di calcolo ha tre colonne: Date, Luogo, Tipo di evento e una decina di eventi come questo. Le date vanno dal 21 al 30 giugno 2013.
Ora SQLite non ha un tipo di data esplicito, quindi è più facile e veloce archiviarlo come int e allo stesso modo in cui Excel utilizza le date (giorni dal 1 ° gennaio 1900) hanno valori int da 41446 a 41455. Se si inseriscono le date in un foglio di calcolo quindi formatta la colonna della data come un numero con 0 cifre decimali, assomiglia a questo:
Ora potremmo archiviare questi dati in una tabella e per un esempio così semplice, sarebbe probabilmente accettabile. Tuttavia, una buona pratica di progettazione del database richiede una certa normalizzazione.
Elementi di dati univoci come il tipo di sede dovrebbero essere nella propria tabella e anche i tipi di evento (festa ecc.) Dovrebbero essere in uno. Infine, poiché possiamo avere più tipi di eventi in più sedi, (una relazione da molte a molte) abbiamo bisogno di una terza tabella per contenere questi.
Le tre tabelle sono:
Le prime due tabelle contengono i tipi di dati, quindi i luoghi hanno nomi da alpha a echo. Ho aggiunto anche un ID intero e creato un indice per quello. Con il piccolo numero di sedi (5) e tipi di eventi (3), potrebbe essere fatto senza un indice, ma con tabelle più grandi, diventerà molto lento. Quindi qualsiasi colonna su cui è probabile che venga cercata, aggiungi un indice, preferibilmente intero
L'SQL per creare questo è:
L'indice nella tabella degli eventi ha data, ID evento, tipo di evento e sede. Ciò significa che possiamo interrogare la tabella degli eventi per "tutti gli eventi in una data", "tutti gli eventi in una sede", "tutte le parti" ecc. E combinazioni di quelli come "tutte le parti in una sede" ecc..
Dopo aver eseguito le query di creazione tabella SQL, vengono create le tre tabelle. Nota Ho inserito tutto quel sql nel file di testo create.sql e include i dati per popolare alcune delle tre tabelle.
Se metti; alla fine delle righe, come ho fatto in create.sql, è possibile eseguire il batch ed eseguire tutti i comandi in una volta sola. Senza il ; devi correre ognuno da solo. In SQLiteSpy, fai clic su F9 per eseguire tutto.
Ho anche incluso sql per eliminare tutte e tre le tabelle all'interno dei commenti su più righe usando / *… * / stesso come in C. Basta selezionare le tre righe e fare ctrl + F9 per eseguire il testo selezionato.
Questi comandi inseriscono le cinque sedi:
Ancora una volta ho incluso il testo commentato per svuotare le tabelle, con il elimina da Linee. Non c'è annullamento, quindi fai attenzione con questi!
Sorprendentemente, con tutti i dati caricati (certamente non molto) l'intero file del database su disco è solo 7 KB.
Invece di creare un gruppo di dieci istruzioni insert, ho usato Excel per creare un file .csv per i dati dell'evento e quindi ho usato l'utilità della riga di comando SQLite3 (fornita con SQLite) e i seguenti comandi per importarla.
Nota: qualsiasi riga con un prefisso punto (.) È un comando. Utilizzare .help per visualizzare tutti i comandi. Per eseguire SQL basta digitarlo senza prefisso periodo.
Devi usare le doppie barre nere \\ nel percorso di importazione per ogni cartella. Esegui l'ultima riga solo dopo che l'importazione è riuscita. Quando SQLite3 viene eseguito, il separatore predefinito è un: quindi deve essere cambiato in una virgola prima dell'importazione.
Ora abbiamo un database completamente popolato, scriviamo il codice C per eseguire questa query SQL che restituisce un elenco di parti, con descrizione, date e sedi.
Questo fa un join usando la colonna idvenue tra la tabella degli eventi e delle sedi in modo da ottenere il nome della sede non il suo valore int idvenue.
Ci sono molte funzioni ma ne abbiamo solo una manciata. L'ordine di elaborazione è:
C'è un passaggio facoltativo dopo aver chiamato sqlite3_prepare in cui tutti i parametri passati sono vincolati ma lo salveremo per un tutorial futuro.
Quindi nel programma elencato di seguito lo pseudo codice per i passaggi principali sono:
Sql restituisce tre valori, quindi se sqlite3.step () == SQLITE_ROW i valori vengono copiati dai tipi di colonna appropriati. Ho usato int e text. Visualizzo la data come un numero ma mi sento libero di convertirla in una data.
Elenco del codice di esempio