Ten samouczek jest drugim z serii programowanie SQLite w C..
SQLite przechowuje kolekcję tabel w jednym pliku Baza danych, zwykle kończące się na .db. Każda tabela jest jak arkusz kalkulacyjny, składa się z kilku kolumn, a każdy wiersz ma wartości.
Jeśli to pomoże, pomyśl o każdym rzędzie jako struct, z kolumny w tabeli odpowiadający polom w strukturze.
Tabela może mieć tyle wierszy, ile zmieści się na dysku. Istnieje górna granica, ale jej ogromna 18 446,744,073,709,551,616.
Tabela może zawierać do 2000 kolumn, a jeśli ponownie skompilujesz źródło, możesz zwiększyć go do niesamowitych 32 767 kolumn.
Interfejs API SQLite
Aby korzystać z SQLite, musimy wykonywać wywołania do API. Wprowadzenie do tego interfejsu API można znaleźć na oficjalnej stronie Wprowadzenie do interfejsu SQLite C / C ++ Strona internetowa. Jest to zbiór funkcji i łatwy w użyciu.
Po pierwsze potrzebujemy uchwytu do bazy danych. Jest to typu sqlite3 i jest zwracane przez wywołanie sqlite3_open (nazwa pliku, ** ppDB). Następnie wykonujemy SQL.
Najpierw jednak wykonajmy małą dygresję i utwórz użyteczną bazę danych oraz niektóre tabele za pomocą SQLiteSpy. (Zobacz poprzedni samouczek, aby uzyskać linki do tego i do przeglądarki bazy danych SQLite).
Wydarzenia i miejsca
Baza danych o. DB będzie przechowywać trzy tabele do zarządzania wydarzeniami w kilku miejscach. Wydarzenia te będą imprezami, dyskotekami i koncertami i odbędą się w pięciu miejscach (alfa, beta, charlie, delta i echo). Podczas modelowania czegoś takiego często pomocne jest rozpoczęcie od arkusza kalkulacyjnego. Dla uproszczenia po prostu przechowuję datę, a nie godzinę.
Arkusz kalkulacyjny ma trzy kolumny: Daty, Miejsce, Typ zdarzenia i około dziesięciu podobnych zdarzeń. Daty trwają od 21 do 30 czerwca 2013 r.
Teraz SQLite nie ma jawnego typu daty, więc łatwiej i szybciej jest przechowywać go jako liczbę całkowitą, a ten sam sposób, w jaki Excel używa dat (dni od 1 stycznia 1900 r.), Ma wartości wewnętrzne od 41446 do 41455. Jeśli umieścisz daty w arkuszu kalkulacyjnym, a następnie sformatujesz kolumnę daty jako liczbę z 0 miejscami po przecinku, wygląda to tak:
Teraz moglibyśmy przechowywać te dane w jednej tabeli i dla tak prostego przykładu prawdopodobnie byłby to do przyjęcia. Jednak dobra praktyka projektowania baz danych wymaga pewnych normalizacja.
Unikalne elementy danych, takie jak typ miejsca, powinny znajdować się w osobnej tabeli, a typy zdarzeń (impreza itp.) Również w jednym. Wreszcie, ponieważ możemy mieć wiele rodzajów zdarzeń w wielu miejscach, (relacja wiele do wielu) potrzebujemy trzeciego stołu, aby je przechowywać.
Te trzy tabele to:
- obiekty - obejmuje wszystkie pięć obiektów
- typy zdarzeń - przechowuje wszystkie trzy typy zdarzeń
- zdarzenia - zawiera datę i identyfikator miejsca oraz identyfikator typu zdarzenia. Dodałem także pole opisu tego wydarzenia, np. „Jim's Birthday”.
Pierwsze dwie tabele zawierają typy danych, więc miejsca mają nazwy alfa, aby je wywołać. Dodałem również identyfikator liczby całkowitej i utworzyłem do tego indeks. Przy małej liczbie miejsc (5) i typów zdarzeń (3) można to zrobić bez indeksu, ale przy większych tabelach będzie bardzo wolno. Tak więc do każdej kolumny, która prawdopodobnie będzie przeszukiwana, dodaj indeks, najlepiej liczbę całkowitą
Kod SQL do utworzenia tego to:
Indeks w tabeli zdarzeń zawiera datę, identyfikator zdarzenia, typ zdarzenia i miejsce. Oznacza to, że możemy zapytać tabelę zdarzeń o „wszystkie wydarzenia w dniu”, „wszystkie wydarzenia w miejscu”, „wszystkie imprezy” itp. Oraz kombinacje takich jak „wszystkie imprezy w miejscu” itp.
Po uruchomieniu zapytania SQL dotyczącego tworzenia tabel tworzone są trzy tabele. Uwaga: Umieściłem cały ten sql w pliku tekstowym create.sql i zawiera on dane do zapełnienia niektórych trzech tabel.
Jeśli umieścisz; na końcu linii, tak jak to zrobiłem w create.sql, wtedy możesz wsadowo i wykonać wszystkie polecenia za jednym razem. Bez; musisz uruchomić każdy z osobna. W SQLiteSpy wystarczy kliknąć F9, aby uruchomić wszystko.
Dodałem także sql, aby upuścić wszystkie trzy tabele w komentarzach wieloliniowych przy użyciu / *.. * / tak samo jak w C. Po prostu wybierz trzy linie i wciśnij Ctrl + F9, aby wykonać zaznaczony tekst.
Te polecenia wstawiają pięć miejsc:
Ponownie dodałem komentarz do pustych tabel wraz z usuń z linie. Nie ma cofania, więc bądź ostrożny z nimi!
O dziwo, przy wszystkich załadowanych danych (co prawda niewiele) cały plik bazy danych na dysku ma tylko 7 KB.
Dane zdarzenia
Zamiast zbudować kilka dziesięciu instrukcji wstawiania, użyłem programu Excel do utworzenia pliku .csv dla danych zdarzenia a następnie użył narzędzia wiersza polecenia SQLite3 (dostarczanego z SQLite) i następujących poleceń do zaimportowania to.
Uwaga: Dowolna linia z prefiksem kropki (.) Jest poleceniem. Użyj .help, aby wyświetlić wszystkie polecenia. Aby uruchomić SQL, wpisz go bez prefiksu kropki.
Musisz użyć podwójnych czarnych ukośników \\ w ścieżce importu dla każdego folderu. Ostatnią linię wykonuj tylko po pomyślnym imporcie .import. Gdy SQLite3 działa, domyślnym separatorem jest: więc przed importem należy go zmienić na przecinek.
Powrót do Kodeksu
Teraz mamy w pełni wypełnioną bazę danych, napiszmy Kod C. aby uruchomić to zapytanie SQL, które zwraca listę stron z opisem, datami i miejscami.
- Nowy w SQL? Przeczytaj Co to jest SQL?
To dokonuje łączenia za pomocą kolumny idvenue między tabelą zdarzeń i miejsc, więc otrzymujemy nazwę miejsca, a nie jego wartość całkowitą.
Funkcje API SQLite C.
Istnieje wiele funkcji, ale potrzebujemy tylko garstki. Kolejność przetwarzania jest następująca:
- Otwórz bazę danych za pomocą sqlite3_open (), zakończ, jeśli wystąpił błąd podczas otwierania.
- Przygotuj SQL za pomocą narzędzia sqlite3_prepare ()
- Zapętlaj używając slqite3_step (), aż nie będzie więcej rekordów
- (W pętli) przetwarzaj każdą kolumnę za pomocą sqlite3_column ...
- Na koniec wywołaj sqlite3_close (db)
Istnieje opcjonalny krok po wywołaniu sqlite3_prepare, w którym wiążą się wszelkie przekazane parametry, ale zachowamy to na przyszły samouczek.
Tak więc w programie wymienionym poniżej pseudo-kod dla głównych kroków to:
SQL zwraca trzy wartości, więc jeśli sqlite3.step () == SQLITE_ROW, wówczas wartości są kopiowane z odpowiednich typów kolumn. Użyłem int i tekstu. Wyświetlam datę jako liczbę, ale mogę ją przekonwertować na datę.
Lista przykładowego kodu