NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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 typu OnNoteAddedListener ú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 hodnota null, nebo hodnota typu String. Standardně zde zadáváme hodnotu null. Hodnotu typu String 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 hodnotu null.
  • values: Proměnná values typu ContentValues, 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ěnnou values 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 typu OnNoteUpdatedListener ú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.


 

Předchozí článek
Databáze v Androidu - Třída SQLiteOpenHelper
Všechny články v sekci
Databáze v Androidu
Přeskočit článek
(nedoporučujeme)
Databáze v Androidu - Další metody pro práci s databází
Článek pro vás napsal Pavel
Avatar
Uživatelské hodnocení:
5 hlasů
Autor se věnuje programování v Javě, hlavně pro Android. Mezi jeho další zájmy patří Arduino, Minecraft.
Aktivity