Image
30.6.2016 0 Comments

Vývoj pre Android – Využitie lokálnej databázy SQLITE / 9. časť

Späť na úvod >> Späť na seriál

Väčšina aplikácií potrebuje niekam ukladať rôzne údaje. Jedna z možností je interná databáza SQLite, ktorá je súčasťou operačného systému Android. Je to malá, ale výkonná klientska relačná databáza, pretože údaje sú uložené na SSD, prípadne v operačnej pamäti.

Databázová aplikácia využíva princíp architektúry klient/server, pričom SQLite plní funkciu lokálneho servera a vaša aplikácia k nemu pristupuje cez vhodné rozhranie. Zjednodušene povedané, aplikácia posiela databázovému serveru príkazy SQL a databázový server ich vykoná. Ak ide o príkaz SQL SELECT, databáza vráti množinu výsledkov, ktoré príslušnému dopytu vyhovujú. Z funkcionalít klasických databázových platforiem SQLite podporuje dopytovanie do viacerých tabuliek, indexovanie, využívanie pohľadov aj triggerov.

Námet príkladu

Námetom príkladu bude vytvoriť jednoduchú aplikáciu, do ktorej si budete zaznamenávať knihy, ktoré ste prečítali. Do databázy sa bude zaznamenávať dátum, meno autora, názov knihy a jej hodnotenie. Keďže hodnota atribútu názov knihy môže byť duplicitná,  na správne fungovanie aplikácie je potrebný aj ďalší atribút, unikátny identifikátor každej položky. SQLite umožňuje jeho automatické generovanie. Na zjednodušenie budeme dátum ukladať ako textový reťazec. Príklad bude rozdelený do dvoch dielov seriálu. V prvom vytvoríme dátový model a v ďalšom používateľské rozhranie.

Ladenie databázovej vrstvy

Pri ladení databázových aplikáciách je dobrý zvyk príkazy SQL, s ktorými bude aplikácia pracovať, najskôr samostatne otestovať. V praxi to prebieha tak, že sa cez konzolovú aplikáciu zadávajú dopyty a kontroluje sa správnosť vrátených výsledkov. Nebudeme zadávať príkazy SQL na zariadeniach s Androidom – hlavne na telefónoch by to nebolo pohodlné. SQLite je multiplatformová databáza, preto si ju nainštalujte z http://sqlite.org na svoj vývojársky počítač. Potrebujete aj konzolovú aplikáciu Command Line Shell For SQLite zo sekcie Precompiled Binaries.

Najskôr vytvorte databázovú tabuľku príkazom CREATE TABLE. Atribút _id bude automaticky sa inkrementujúci unikátny identifikátor záznamu typu INTEGER PRIMARY KEY.

CREATE TABLE knihy
(
   _id INTEGER PRIMARY KEY AUTOINCREMENT,
   autor TEXT,
   kniha TEXT,
   datum TEXT,
   hodnotenie TEXT
);

Následne otestujte príkaz INSERT na vloženie nového záznamu do práve vytvorenej tabuľky. Vložte aspoň dva záznamy

INSERT INTO knihy (autor, kniha, datum, hodnotenie)
VALUES ('Scott Kellby', 'Digitálna fotografia I', '5.04.2015', 'super');
Správnosť vytvorenia databázovej tabuľky a vloženia záznamov overíte výpisom príkazu SELECT
SELECT * FROM knihy;

Rovnakým postupom odlaďte aj príkazy na zmenu a vymazanie údajov z databázových tabuliek. Ak príkazy správne fungujú v konzolovej aplikácii, nie je dôvod, prečo by nemali fungovať vo vašej androidovej aplikácii.

Dátový model

V aplikácii potrebujete vytvoriť vrstvu, ktorá bude riešiť ukladanie údajov. Nazveme ju DataModel. Jej úlohou bude zistiť, či je už pre aplikáciu vytvorená databáza a tabuľka, ak nie, treba tieto objekty pri prvom spustení aplikácie vytvoriť. Trieda zabezpečí aj čítanie a ukladanie údajov. V zložke zdrojových kódov Java v našom prípade com.example.knihy vytvorte novú triedu DataModel. Trieda bude odvodená od triedy SQLiteOpenHelper. V metóde onCreate() je sformulovaný reťazec príkazu SQL na vytvorenie novej databázovej tabuľky.

Najskôr definujte textové konštanty. Názov databázy, databázovej tabuľky, názvy jej atribútov, prípadne aj klauzulu ORDER BY, ak chcete funkcionalitu aplikáciu rozšíriť aj o utriedenie. Prípadné úpravy budete potom robiť len na jednom mieste

protected static final String DB_DATABAZA = "dbKknihy";
protected static final int DB_VERZIA = 1;
protected static final String DB_TABULKA = "tblKnihy";
 
public static final String ATR_ID = "_id";
public static final String ATR_AUTOR = "autor";
...

 

Konštruktor triedy DataModel má ako parameter objekt Context.  Kontextom býva spravidla aktivita, ktorá helper využíva.

public DataModel(Context ctx)
{
    super(ctx, "DB_DATABAZA", null, DB_VERZIA);
}
 

Význam parametrov v konštruktore rodičovskej triedy SQLiteOpenHelper:

V metóde onCreate() sa volá metóda execSQL(). Jej parametrom je príkaz SQL.

@Override
public void onCreate(SQLiteDatabase db)
{
      db.execSQL("CREATE TABLE " + DB_TABULKA
                   + " (" + ATR_ID     + " INTEGER PRIMARY KEY,"
                   + ATR_AUTOR  + " TEXT,"
                   + ATR_KNIHA + " TEXT,"
                   + ATR_DATUM + " TEXT,"
                   + ATR_HODNOTENIE + " TEXT"
                   + ");");
}

 

Metóda execSQL() sa dá využiť len na príkazy SQL, ktoré nevracajú údaje.

V metóde onUpdate() vymažete databázovú tabuľku, samozrejme, iba v prípade, ak existuje, a zavoláte metódu onCreate() na vytvorenie novej aktualizovanej tabuľky.

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
  String query = "DROP TABLE IF EXISTS " + DB_TABULKA;
      db.execSQL(query);
  onCreate(db);
}

 

Metóda sa volá, ak je verzia databázy v zariadení staršia ako hodnota v parametroch konštruktora rodičovskej triedy SQLiteOpenHelper. V reálnej aplikácii by z takéhoto riešenia pri zmene návrhovej štruktúry databázy používatelia nadšení neboli. Odstránenie tabuľky znamená vymazanie všetkých údajov, ktoré v nej boli uložené.

Vkladanie záznamov do databázy

Na získanie objektu SQLiteDatabase sa v závislosti od typu operácie využívajú metódy SQLiteOpenHelper.getReadableDatabase() a SQLiteOpenHelper.getWritableDatabase(). V druhom prípade je objekt otvorený na zápis aj čítanie. Metóda SQLiteOpenHelper.close() zatvorí všetky prepojenia na databázu.

Na vkladanie údajov slúži metóda Insert triedy SQLiteDatabase.

public long vlozZaznam(HashMap<String, String> atributy)
{
      SQLiteDatabase db = this.getWritableDatabase();
      ContentValues val = new ContentValues();
      val.put(ATR_AUTOR, atributy.get(ATR_AUTOR));
      ...
      long id = db.insert(DB_TABULKA, null, val);
      db.close();
      return id;
}

 

Ako vstupný parameter je použitá štruktúra HashMap, ktorá je implementáciou dátovej štruktúry Map. Vkladané údaje sú zapuzdrené v objekte typu ContentValues. V prípade úspechu metóda vráti vygenerovaný identifikátor vloženého záznamu, v opačnom prípade vráti metóda hodnotu -1.

Aktualizovanie a vymazanie záznamov

Na aktualizovanie údajov je aplikovaná metóda update. Metóda aktualizujZaznam() vráti počet aktualizovaných záznamov.

public int aktualizujZaznam(HashMap<String, String> atributy)
{
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues val = new ContentValues();
    val.put(ATR_AUTOR, atributy.get(ATR_AUTOR));
    ...
    return db.update(DB_TABULKA, val, ATR_ID + " = ?",
                     new String[] {atributy.get(ATR_ID)});
}
 

Na vymazanie záznamov z databázovej tabuľky je aplikovaná metóda delete. Ukážeme najjednoduchšiu verziu s priamo zadaným reťazcom príkazu SQL DELETE

public void vymazZaznam(String id)
{
      SQLiteDatabase db = this.getWritableDatabase();
      String deleteQuery = "DELETE FROM " + DB_TABULKA + " WHERE _id='"+ id +"'";
      db.execSQL(deleteQuery);
}

 

Výber údajov z databázovej tabuľky

Objekt SQLiteDatabase  sa využíva aj na dopytovanie aplikácie na údaje v databáze. Na výber údajov z databázovej tabuľky sme využili metódu query. V triede DataModel, ktorá je odvodená od triedy SQLiteOpenHelper, implementujeme dve metódy.

Metóda dajZaznamy()  vráti všetky záznamy vo forme poľa ArrayList.

public ArrayList<HashMap<String, String>> dajZaznamy()
{
     ArrayList<HashMap<String, String>> alVysledky;
     alVysledky = new ArrayList<HashMap<String, String>>();
     String sSQL = "SELECT * FROM " + DB_TABULKA;
     SQLiteDatabase db = this.getWritableDatabase();
     Cursor cursor = db.rawQuery(sSQL, null);     
   
    //kurzor na prvy zaznam
    if (cursor.moveToFirst())
    {
        do
        {
            HashMap<String, String> hm = new HashMap<String, String>();
            hm.put(ATR_ID, cursor.getString(0));
            hm.put(ATR_AUTOR, cursor.getString(1));
            ...
            alVysledky.add(hm);
        } while (cursor.moveToNext()); // kurzor na dalsi zaznam
    }
    return alVysledky;
}

 

Metódu môžete jednoducho modifikovať, aby boli vybrané iba záznamy, ktoré vyhovujú špecifickej podmienke. Stačí do SQL príkazu SELECT doplniť klauzulu WHERE.

Metóda dajZaznam() vráti konkrétny záznam podľa zadaného identifikátora _id. Záznam je vrátený ako objekt typu HashMap.

public HashMap<String, String> dajZaznam(String id)
{
      HashMap<String, String> hm = new HashMap<String, String>();
      SQLiteDatabase db = this.getReadableDatabase();
      String sSQL = "SELECT * FROM " + DB_TABULKA + " WHERE _id='"+id+"'";
     Cursor cursor = db.rawQuery(sSQL, null);
      if (cursor.moveToFirst())
      {
        do
        {
            hm.put(ATR_AUTOR, cursor.getString(1));
            ...
                     
        } while (cursor.moveToNext());
    }                       
    return hm;
}    

 

V budúcom pokračovaní sa budeme venovať návrhu používateľského rozhrania databázovej aplikácie.

 

 

 

 

 

Zobrazit Galériu

Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

ITPro

Linux súkromne i pracovne v2.0 (14. časť): Small Business Server

09.11.2016 14:57

Pojem Small Business Server (malý firemný server) začala používať spoločnosť Microsoft ešte v roku 2000 na označenie servera, ktorý ­dokázal plniť úlohy niekoľkých samostatných serverov. Aplikačná vrs ...

ITPro

Industry 4.0: Fikcia alebo už realita?

09.11.2016 14:52

Štvrtá priemyselná revolúcia je pomenovanie rozsiahlych zmien prudko vstupujúcich do súčasného priemyslu. Nositeľom týchto zmien je digitalizácia výroby a optimalizácia všetkých podnikových procesov v ...

ITPro

Vývoj aplikácií UWP pre Xbox One II.

09.11.2016 14:47

V predošlej časti sme ukázali postup, ako si ­vytvoriť vývojársky účet a aktivovať vývojársky režim na hernej konzole Xbox One, aby ste mohli testovať svoje aplikácie. Výhodou hernej konzoly Xbox je v ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá