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 typuString
dosazujeme 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ávalues
typuContentValues
, 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ěnnouvalues
bez 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.