Lekce 1 - Databáze v Androidu - Vytvoření ukázkového projektu
Vítejte u seriálu o ukládání dat do databáze v Androidu.
Postupně si ukážeme dva způsoby programování databáze - starší a novější. Díky tomu bude výklad rozdělen do dvou samostatných celků.
Nejprve budeme pracovat na projektu, který bude s databází pracovat základním (starším) způsobem. Po dokončení projektu jej upravíme pro použití novějšího způsobu práce s databází (knihovna Room).
Samozřejmostí bude i ukázkový projekt v podobě jednoduchého poznámkového bločku, který bude nové poznámky ukládat do databáze. Tato databáze bude umístěna v úložišti zařízení, na kterém aplikace poběží.
Na hlavní obrazovce ukázkové aplikace bude zobrazován seznam
uložených poznámek. Po kliknutí na libovolnou poznámku bude v
dialogovém okně zobrazen její obsah. Každé poznámce
budeme moci nastavit prioritu (Nízká
,
Střední
nebo Vysoká
), která bude mít vliv na
barvu poznámky v seznamu poznámek. Také
bude možné jakoukoliv poznámku označit jako neaktivní.
Hlavní okno aplikace bude vypadat takto:
Detail poznámky:
Vytvoření nové poznámky:
Vytvoření projektu
Notepad
Přesuneme se do okna se šablonami. V levé části okna vybereme možnost Phone and Tablet. V pravé části okna vybereme možnost Empty Activity:
V dalším okně, do políčka Name, zadáme název našeho
projektu Notepad
. Do políčka Package name
napíšeme cz.itnetwork.notepad
. Protože budeme programovat v
Javě, vybereme v políčku Language možnost
Java:
Po dokončení nastavení projektu je zobrazeno vývojové prostředí
Android studia, v němž vidíme otevřené vygenerované
soubory MainActivity.java
a activity_main.xml
:
Soubor strings.xml
Do souboru strings.xml
ukládáme
textové řetězce
použité v projektu. V Java kódu, nebo XML
kódu na ně pouze odkazujeme. Soubor
res/values/strings.xml
patří mezi soubory automaticky
generované Android studiem při vytvoření projektu:
Do souboru strings.xml
přidáme následující řádky:
<string name="delete_note">Odstranění poznámky</string> <string name="question_delete_note">Opravdu tuto poznámku smazat?</string> <string name="yes">Ano</string> <string name="close">Zavřít</string> <string name="note_detail">Detail poznámky</string> <string name="no">Ne</string> <string name="warning">Upozornění</string> <string name="question_close">Poznámka nebude uložena. Opravdu zavřít?</string>
Rozhraní AppConstants
Rozhraní AppConstants
vytvoříme z důvodu
přehlednosti kódu projektu. Jeho účelem je vytvořit
úložiště konstant použitých v projektu. V případě
tohoto projektu to není nutné, protože budeme deklarovat pouze tři
konstanty. V rozsáhlejších projektech je to velmi užitečné.
Ve struktuře projektu klikneme pravým tlačítkem myši na
složku notepad
a v zobrazeném menu, přes položku
New, zvolíme možnost Java Class:
V zobrazeném okně doplníme do prvního textového políčka název
nového rozhraní, v našem případě AppConstants
. Pod
textovým políčkem označíme možnost Interface a potvrdíme
stisknutím klávesy Enter:
Zde je vždy defaultně vybrána možnost Class. Pokud bychom zapomněli tuto možnost přepnout na Interface, byla by místo rozhraní vytvořena klasická třída.
Vytvořený soubor AppConstants.java
otevřeme a doplníme
těmito třemi řádky:
public interface AppConstants { int PRIORITY_LOW = 0; int PRIORITY_NORMAL = 1; int PRIORITY_HIGH = 2; }
Rozhraní AppConstants
můžeme v projektu použít dvěma
způsoby. Prvním způsobem je přímý přístup:
note.setPriority(AppConstants.PRIORITY_HIGH);
Druhou možností je implementace rozhraní
AppConstants
třídou, v jejímž kódu potřebujeme konstanty
rozhraní použít:
public class MyClass implements AppConstants { ... note.setPriority(PRIORITY_HIGH); ... }
Třída MyClass
ve své hlavičce implementuje
rozhraní AppConstants
.
Třída Note
Nyní ve struktuře projektu vytvoříme novou třídu
Note
, reprezentující datový model poznámek. Ve
složce notepad
vytvoříme další složku s
názvem objects
a v ní novou třídu
Note
:
public class Note { }
Proměnné
Ve třídě Note
deklarujeme tyto proměnné:
private int id; private String noteTitle; private String noteContent; private long date; private int priority; private boolean isActive;
Popis proměnných:
id
: Hodnota typuint
s ID poznámky, přiděleným databází při uložení poznámky.noteTitle
: Textový řetězecString
s nadpisem poznámky.noteContent
: Textový řetězecString
s obsahem poznámky.date
: Hodnota typulong
s datem vytvoření poznámky v milisekundách.priority
: Číslo typuint
s číselným kódem priority poznámky. Budeme používat tři úrovně důležitosti poznámky, které máme připravené jako konstanty v rozhraníAppConstants
.isActive
: Hodnota typuboolean
sloužící k označení poznámky jako (ne)aktivní. Neaktivní znamená, že ji aktuálně nepotřebujeme, ale chceme ji nechat uloženou v databázi. V seznamu poznámek bude mít šedou barvu pozadí.
Konstruktory
Dále ve třídě Note
deklarujeme dva
konstruktory:
public Note() {} public Note(int id, String noteTitle, String noteContent, long date, int priority, boolean isActive) { this.id = id; this.noteTitle = noteTitle; this.noteContent = noteContent; this.date = date; this.priority = priority; this.isActive = isActive; }
Nejprve jsme deklarovali bezparametrický konstruktor. V
druhém parametrickém konstruktoru přijímáme všechny
parametry. Parametrický konstruktor použijeme při vytváření nové
poznámky a při převodu surových dat načtených z databáze na objekty typu
Note
.
Deklaruje-li třída konstruktor s parametry,
nelze v kódu projektu použít konstruktor bez parametrů
např. Note n = new Note();
. Explicitní deklarací
bezparametrického konstruktoru obnovíme možnost jeho
použití.
Gettery a settery
Nakonec ve třídě Note
deklarujeme sadu klasických
getterů a setterů:
public int getId() { return id; } public void setId(int id) { this.id = id; } public String getNoteTitle() { return noteTitle; } public void setNoteTitle(String noteTitle) { this.noteTitle = noteTitle; } public String getNoteContent() { return noteContent; } public void setNoteContent(String noteContent) { this.noteContent = noteContent; } public long getDate() { return date; } public void setDate(long date) { this.date = date; } public int getPriority() { return priority; } public void setPriority(int priority) { this.priority = priority; } public boolean isActive() { return isActive; } public void setActive(boolean active) { isActive = active; }
V příští lekci, Databáze v Androidu - Třída SQLiteOpenHelper, si pomocí Java kódu nadefinujeme strukturu budoucí databáze poznámkového bločku.