Lekce 3 - Databáze v Androidu - Metody pro práci s databází
V předchozí lekci, Databáze v Androidu - Třída SQLiteOpenHelper, jsme deklarovali třídu
DbHelper, definující strukturu databáze pro ukládání
poznámek.
V dnešním Java tutoriálu vytvoříme potřebná rozhraní
a třídu DataSource s komponenty pro přístup k datům naší
databáze.
Rozhraní
Nejprve deklarujeme všechna rozhraní, které budeme v parametrech metod
dnes potřebovat. Naše rozhraní budou posluchače událostí
(listenery), a proto pro ně ve struktuře projektu vytvoříme
samostatnou složku listeners/.
Rozhraní
OnNoteAddedListener
Ve struktuře projektu, v naší složce listeners/, deklarujeme
nové rozhraní OnNoteAddedListener, které bude informovat o
dokončení zápisu v tom místě Java kódu, ze kterého byl
zápis dat požadován.
K čemu potřebujeme být informováni o dokončení zápisu do databáze?
Novou poznámku budeme v aplikaci vytvářet z okna, ve kterém bude
seznam všech poznámek. Po přidání nové poznámky musíme
seznam poznámek aktualizovat, aby obsahoval i nově vytvořenou
poznámku. Aktualizaci provedeme právě až ve chvíli, kdy budeme
prostřednictvím rozhraní OnNoteAddedListener upozorněni, že
byl zápis dokončen.
Nově vytvořený soubor OnNoteAddedListener.java otevřeme a
přidáme deklaraci metody onNoteAdded(),
přijímající parametr newId typu long pro ID nově
vloženého řádku v tabulce databáze:
public interface OnNoteAddedListener { void onNoteAdded(long newId); }
Rozhraní
OnNoteUpdatedListener
Ve struktuře projektu, v naší složce listeners/, deklarujeme
další rozhraní s názvem OnNoteUpdatedListener, které nás bude
informovat o dokončení aktualizace.
Soubor OnNoteUpdatedListener.java doplníme Java kódem takto:
public interface OnNoteUpdatedListener { void onNoteUpdatedd(); }
Všechna rozhraní, které budeme dnes potřebovat, máme hotové.
Třída DataSource
Ve struktuře projektu, ve složce database/, vytvoříme novou
třídu DataSource:
public class DataSource { }
Proměnné třídy
DataSource
V úvodu třídy DataSource deklarujeme tři proměnné:
private SQLiteDatabase database; Context context; private DbHelper dbHelper;
Proměnná database je typu SQLiteDatabase a
slouží k uložení reference na databázi.
Proměnná context bude obsahovat referenci na
kontext, který k datům databáze pomocí
této třídy přistupuje. Poslední proměnnou je proměnná
dbHelper sloužící k uložení instance naší
třídy DbHelper.
Konstruktor třídy
DataSource
Pod proměnnými deklarujeme konstruktor:
public DataSource(Context context) { dbHelper = new DbHelper(context); this.context = context; }
Jediný parametr konstruktoru context ukládáme do
proměnné context. Konstruktorem dále zároveň inicializujeme
proměnnou dbHelper.
Metody třídy DataSource
Do třídy DataSource napíšeme tyto metody:
Metoda open()
Touto metodou získáme přístup k databázi:
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ázi otevíráme voláním metody getWritableDatabase() na
instanci dbHelper třídy DbHelper. Třída
DbHelper je odvozena od třídy SQLiteOpenHelper,
které metoda getWritableDatabase() patří. Metoda
getWritableDatabase() otevře databázi ke čtení a
zápisu dat. Pokud dosud naše databáze nebyla vytvořena, metoda
getWritableDatabase() jí nejprve vytvoří.
Metoda closeDatabase()
Tuto metodu voláme po dokončení práce s databází:
public void closeDatabase() { if (dbHelper != null) dbHelper.close(); dbHelper = null; }
Pokud instance dbHelper neobsahuje hodnotu null,
voláme na ní metodu close(). Metoda close() patří
třídě SQLiteOpenHelper, od které je odvozena naše třída
DbHelper. Metodu closeDatabase() v celém projektu
voláme pouze jednou - v metodě onDestroy() v
MainActivity.java pro uvolnění systémových prostředků po
ukončení aplikace.
Metoda addNote()
Pro umožnění zápisu nové poznámky do databáze si
napíšeme metodu addNote(), která přijímá dva parametry:
note: Nově ukládaná poznámka.listener: Reference na posluchače události typuOnNoteAddedListenerúspěšného vložení nové poznámky do databáze, kterého jsme si vytvořili na začátku lekce.
Kód metody je následující:
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 podmínce nejprve otestujeme poznámku note na hodnotu
null. Při splnění podmínky je metoda ukončena. V opačném
případě voláme metodu open() pro zpřístupnění
databáze. Dále vytvoříme proměnnou values typu
ContentValues. Třída ContentValues je podobná
třídě Map a slouží k vytvoření sady hodnot.
Do naší proměnné values vkládáme hodnoty společně s
klíčem, který odpovídá názvu daného
sloupce databázové tabulky. Jako klíče použijeme konstanty
s názvy sloupců z naší třídy DbHelper.
Na instanci database zavoláme metodu insert(),
která přijímá tři parametry:
table: Název tabulky do které zapisujeme -String.nullColumnHack: Zde může být hodnotanull, nebo hodnota typuString. Standardně zde zadáváme hodnotunull. Hodnotu typuStringdosazujeme pouze v případě vkládání prázdného řádku do tabulky databáze. V takovém případě do tohoto parametru dosadíme název sloupce tabulky, který může obsahovat hodnotunull.values: ProměnnávaluestypuContentValues, kterou jsme vytvořili a naplnili daty. Pokud budeme do tabulky vkládat prázdný řádek (viz. druhý parametr), dosadíme do tohoto parametru proměnnouvaluesbez přidaných hodnot.
Metoda insert() vrací ID nově vloženého řádku
v tabulce databáze.
Metoda updateNote()
Pro umožnění aktualizace poznámky v databázi si
napíšeme metodu updateNote(), která přijímá dva
parametry:
note: aktualizovaná poznámka.listener: Reference na posluchače události typuOnNoteUpdatedListenerúspěšné dokončení aktualizace poznámky v databázi, kterého jsme si vytvořili na začátku této lekce.
Tělo metody je podobné tělu předchozí metody addNote(). Zde
voláme database.update() vracející počet ovlivněných
řádků tabulky databáze při provedení požadavku na databázi:
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 příští lekci, Databáze v Androidu - Další metody pro práci s databází, budeme pokračovat s deklarací dalších metod
naší třídy DataSource a tím práci na této třídě
dokončíme.


