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žkulisteners/.
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 typuOnNoteAddedListenerú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ť hodnotanull, alebo hodnota typuString. Štandardne tu zadávame hodnotunull. Hodnotu typuStringdosadzujeme 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ť hodnotunull.values: PremennávaluestypuContentValues, 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úvaluesbez 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 typuOnNoteUpdatedListenerú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.

