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 typuString
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ť hodnotunull
.values
: Premennávalues
typuContentValues
, 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 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.