Zarábaj až 6 000 € mesačne! Akreditované rekvalifikačné kurzy od 0 €. Viac informácií.

3. diel - Databázy v Androide - Metódy pre prácu s databázou

V predchádzajúcej lekcii, Databázy v Androide - Trieda SQLiteOpenHelper , sme deklarovali triedu DbHelper, definujúcu štruktúru databázy na ukladanie poznámok.

V dnešnom Java tutoriále vytvoríme potrebné rozhrania a triedu DataSource s komponentmi pre prístup k dátam našej databázy.

Rozhranie

Najprv deklarujeme všetky rozhrania, ktoré budeme v parametroch metód dnes potrebovať. Naše rozhranie budú poslucháčov udalostí (listenerov), a preto pre nich v štruktúre projektu vytvoríme samostatnú zložku listeners/.

Rozhranie OnNoteAddedListener

V štruktúre projektu, v našej zložke listeners/, deklarujeme nové rozhranie OnNoteAddedListener, ktoré bude informovať o dokončení zápisu v tom mieste Java kódu, z ktorého bol zápis dát požadovaný.

Na čo potrebujeme byť informovaní o dokončení zápisu do databázy? Novú poznámku budeme v aplikácii vytvárať z okna, v ktorom bude zoznam všetkých poznámok. Po pridaní novej poznámky musíme zoznam poznámok aktualizovať, aby obsahoval aj novo vytvorenú poznámku. Aktualizáciu vykonáme práve až vo chvíli, keď budeme prostredníctvom rozhrania OnNoteAddedListener upozornení, že bol zápis dokončený.

Novovytvorený súbor OnNoteAddedListener.java otvoríme a pridáme deklaráciu metódy onNoteAdded(), prijímajúcu parameter newId typu long pre ID novo vloženého riadku v tabuľke databázy:

public interface OnNoteAddedListener {
    void onNoteAdded(long newId);
}

Rozhranie OnNoteUpdatedListener

V štruktúre projektu, v našej zložke listeners/, deklarujeme ďalšie rozhranie s názvom OnNoteUpdatedListener, ktoré nás bude informovať o dokončení aktualizácie. Súbor OnNoteUpdatedListener.java doplníme Java kódom takto:
public interface OnNoteUpdatedListener {
    void onNoteUpdatedd();
}

Všetky rozhrania, ktoré budeme dnes potrebovať, máme hotové.

Trieda DataSource

V štruktúre projektu, v priečinku database/, vytvoríme novú triedu DataSource:
public class DataSource {

}

Premenné triedy DataSource

V úvode triedy DataSource deklarujeme tri premenné:
private SQLiteDatabase database;
Context context;
private DbHelper dbHelper;

Premenná database je typu SQLiteDatabase a slúži na uloženie referencie na databázu. Premenná context bude obsahovať referenciu na kontext, ktorý k dátam databázy pomocou tejto triedy pristupuje. Poslednou premennou je premenná dbHelper slúžiaca na uloženie inštancie našej triedy DbHelper.

Konštruktor triedy DataSource

Pod premennými deklarujeme konštruktor:
public DataSource(Context context) {
    dbHelper = new DbHelper(context);
    this.context = context;
}

Jediný parameter konštruktora context ukladáme do premennej context. Konštruktorom ďalej zároveň inicializujeme premennú dbHelper.

Metódy triedy DataSource

Do triedy DataSource napíšeme tieto metódy:

Metóda open()

Touto metódou získame prístup k databáze:
public void open() throws SQLException {
    if (database != null) {
       return;
    }

    try {
        database = dbHelper.getWritableDatabase();
    } catch (NullPointerException e) {
        e.printStackTrace();
        dbHelper = new DbHelper(context);
        database = dbHelper.getWritableDatabase();
    } catch (IllegalStateException e) {
        e.printStackTrace();
    }
}

Databázu otvárame volaním metódy getWritableDatabase() na inštancii dbHelper triedy DbHelper. Trieda DbHelper je odvodená od triedy SQLiteOpenHelper, ktoré metóda getWritableDatabase() patrí. Metóda getWritableDatabase() otvorí databázu na čítanie a zápis údajov. Ak ešte nebola vytvorená naša databáza, metóda getWritableDatabase() ju najskôr vytvorí.

Metóda closeDatabase()

Túto metódu voláme po dokončení práce s databázou:
public void closeDatabase() {
    if (dbHelper != null) dbHelper.close();
    dbHelper = null;
}

Pokiaľ inštancia dbHelper neobsahuje hodnotu null, voláme na ňu metódu close(). Metóda close() patrí triede SQLiteOpenHelper, od ktorej je odvodená naša trieda DbHelper. Metódu closeDatabase() v celom projekte voláme iba raz - v metóde onDestroy() v MainActivity.java na uvoľnenie systémových prostriedkov po ukončení aplikácie.

Metóda addNote()

Pre umožnenie zápisu novej poznámky do databázy si napíšeme metódu addNote(), ktorá prijíma dva parametre:
  • note: Novo ukladaná poznámka.
  • listener: Referencie na poslucháčov udalosti typu OnNoteAddedListener úspešného vloženia novej poznámky do databázy, ktorého sme si vytvorili na začiatku lekcie.

Kód metódy je nasledujúci:

public void addNote(final Note note, final OnNoteAddedListener listener) {
    if (note == null) {
        if (listener != null) listener.onNoteAdded(-1);
        return;
    }

    open();

    ContentValues values = new ContentValues();
    values.put(DbHelper.COLUMN_TITLE, note.getNoteTitle());
    values.put(DbHelper.COLUMN_CONTENT, note.getNoteContent());
    values.put(DbHelper.COLUMN_DATE, note.getDate());
    values.put(DbHelper.COLUMN_PRIORITY, note.getPriority());
    values.put(DbHelper.COLUMN_IS_ACTIVE, note.isActive() ? 1 : 0);

    long insertId = database.insert(DbHelper.TABLE_NOTES, null, values);

    if (listener != null) listener.onNoteAdded(insertId);
}

V podmienke najprv otestujeme poznámku note na hodnotu null. Pri splnení podmienky je metóda ukončená. V opačnom prípade voláme metódu open() pre sprístupnenie databázy. Ďalej vytvoríme premennú values typu ContentValues. Trieda ContentValues je podobná triede Map a slúži na vytvorenie sady hodnôt. Do našej premennej values vkladáme hodnoty spoločne s kľúčom, ktorý zodpovedá názvu daného stĺpca databázovej tabuľky. Ako kľúče použijeme konštanty s názvami stĺpcov z našej triedy DbHelper.

Na inštancii database zavoláme metódu insert(), ktorá prijíma tri parametre:

  • table: Názov tabuľky do ktorej zapisujeme - String.
  • nullColumnHack: Tu môže byť hodnota null, alebo hodnota typu String. Štandardne tu zadávame hodnotu null. Hodnotu typu String dosadzujeme iba v prípade vkladania prázdneho riadku do tabuľky databázy. V takom prípade do tohto parametra dosadíme názov stĺpca tabuľky, ktorý môže obsahovať hodnotu null.
  • values: Premenná values typu ContentValues, ktorú sme vytvorili a naplnili dátami. Pokiaľ budeme do tabuľky vkladať prázdny riadok (viď. druhý parameter), dosadíme do tohto parametra premennú values bez pridaných hodnôt.

Metóda insert() vracia ID novo vloženého riadku v tabuľke databázy.

Metóda updateNote()

Pre umožnenie aktualizácie poznámky v databáze si napíšeme metódu updateNote(), ktorá prijíma dva parametre:
  • note: aktualizovaná poznámka.
  • listener: Referencie na poslucháčov udalosti typu OnNoteUpdatedListener úspešné dokončenie aktualizácie poznámky v databáze, ktorého sme si vytvorili na začiatku tejto lekcie.

Telo metódy je podobné telu predchádzajúcej metódy addNote(). Tu voláme database.update() vracajúci počet ovplyvnených riadkov tabuľky databázy pri vykonaní požiadavky na databázu:

public void updateNote(Note note, OnNoteUpdatedListener listener) {
    if (note == null) {
        if (listener != null) listener.onNoteUpdatedd();
        return;
    }

    open();

    ContentValues values = new ContentValues();
    values.put(DbHelper.COLUMN_TITLE, note.getNoteTitle());
    values.put(DbHelper.COLUMN_CONTENT, note.getNoteContent());
    values.put(DbHelper.COLUMN_DATE, note.getDate());
    values.put(DbHelper.COLUMN_PRIORITY, note.getPriority());
    values.put(DbHelper.COLUMN_IS_ACTIVE, note.isActive() ? 1 : 0);

    int countOfUpdatedRows = database.update(DbHelper.TABLE_NOTES, values, DbHelper.COLUMN_ID + " = ?", new String[] {String.valueOf(note.getId())});
    if (listener != null) listener.onNoteUpdatedd();
}

V budúcej lekcii Databázy v Androide - Ďalšie metódy pre prácu s databázou budeme pokračovať s deklaráciou ďalších metód našej triedy DataSource a tým prácu na tejto triede dokončíme.


 

Predchádzajúci článok
Databázy v Androide - Trieda SQLiteOpenHelper
Všetky články v sekcii
Databázy v Androide
Preskočiť článok
(neodporúčame)
Databázy v Androide - Ďalšie metódy pre prácu s databázou
Článok pre vás napísal Pavel
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v Javě, hlavně pro Android. Mezi jeho další zájmy patří Arduino, Minecraft.
Aktivity