Skip to main content

SQLite – Baza danych w telefonie cz. 2

W poprzedniej części artykułu nauczyliśmy się korzystać z SQL Managera, narzędzia służącego do zarządzania bazą danych SQLite.

W tej części artykułu opisze podstawowe operacje na bazie danych w języku C++.

Uprzednio stworzoną bazę danych BadaDev.sqlite umieszczamy w katalogu /Home naszej aplikacji.
Katalog ten jest przeznaczony na pliki z których aplikacja będzie korzystała podczas swojej pracy.

Aby korzystać z funkcji oferowanych przez bibliotekę SQLite, wymagane jest dołączenie pliku nagłówkowego FIo.h.

#include <FIo.h>

// Połączenie z bazą danych
Osp::Io::Database* db = null;
db = new Osp::Io::Database();

result r = db->Construct(L"/Home/BadaDev.sqlite", false);
if (IsFailed(r))
{
  AppLogException("Błąd połączenia");
  // zakończ program/funkcję np. przez return jeśli jesteś w funkcji
} else {
  AppLog("Połączenie nawiązano");
}

// Wyświetlenie zawartości tabeli users

Osp::Io::DbEnumerator* pEnum;
Osp::Io::DbStatement* pStmt1;

String query1(L"SELECT id, username FROM users");
pEnum = db->QueryN(query1);

if (pEnum != null)
{
  int id;
  String username;

  while(pEnum->MoveNext() == E_SUCCESS)
  {
    pEnum->GetIntAt(0, id);  // pierwsza kolumna id
    pEnum->GetStringAt(1, username);  // druga kolumna username

    AppLogDebug("Uzytkownik: %d, %S", id, username.GetPointer());
  }

  delete pEnum;
}

// Zamknięcie połączenia
if (db != null) {
  delete db;
}

W oknie Output powinniśmy zobaczyć wszystkich użytkowników z tabeli users.
Ale jak wyświetlić użytkowników, którzy spełniają jakiś warunek?
Do zbudowania zapytania, które wymaga podania pewnych kryteriów wyszukiwania, powinniśmy posłużyć się funkcjami CreateStatementN() i ExecuteStatementN().
Aby wyświetlić użytkownika o id równym 1 należy linie 21-22 zastąpić następującym fragmentem:

pStmt1 = db->CreateStatementN(L"SELECT id, username FROM users WHERE id = ?");
pStmt1->BindInt(0, 1); // 0 oznacza indeks argumentu
pEnum = db->ExecuteStatementN(*pStmt1);

Pozostałej części kodu nie musimy zmieniać, ale wiedząc, że każdy użytkownik posiada unikalne id, w wyniku zawsze zostanie zwrócony maksymalnie jeden rekord. Z tego też powodu z pętli while możemy zrezygnować na rzecz zwykłego if.

Tak naprawdę, ten sam wynik osiągnęlibyśmy modyfikując pierwszą wersję zapytania w linii 20. Przykład:

String query1(L"SELECT id, username FROM users WHERE id = ");
query1.Append(1);

Nie mniej należy pamiętać, że w tym przypadku musimy bardzo uważać na poprawność zapytania, pamiętać o apostrofach dla wartości typu String itp., z tego też powodu nie polecam tej metody.

Artykuł pisałem z tzw. palca. Kod nie był kompilowany i testowany. Jeśli znajdziesz jakiś błąd, proszę o informację w komentarzu. Jeśli będzie zainteresowanie omawianym tematem, postaram się opisać dodatkowe operacje, takie jak aktualizacja i kasowanie rekordów.

Więcej informacji o korzystaniu z bazy danych znajdziesz w dokumentacji na bada.com.

markac

Full-stack Web Developer