Lekce 14 - Diář s databází v Kotlin
V minulé lekci, Datum a čas v Kotlin - Parsování a porovnávání, jsme si ukázali práci s datem a časem.
V dnešním Kotlin tutoriálu si zkusíme uložit objekty do kolekce
List a dále s nimi pracovat.
Prvně jsem chtěl vytvořit databázi uživatelů, ale uživatele jsme tu
již několikrát měli. Jelikož jsme se nedávno naučili datum a čas,
naprogramujeme si diář. Do databáze budeme ukládat jednotlivé záznamy a
vždy vypíšeme ten dnešní a zítřejší. Databáze to nebude samozřejmě
ta v tom pravém slova smyslu (na to ještě nemáme zkušenosti), ale bude se
jednat právě o List v operační paměti počítače. Diář bude
umožňovat záznamy přidávat, hledat je podle data a mazat podle data a
času. Založte si nový projekt, pojmenujte jej např.
Poznamkovac, aby se nejmenoval stejně jako třída
Diar, která v něm později také bude.
Záznam
Prvně si udělejme třídu, jejíž instance budeme ukládat. Nazvěme ji
Zaznam. Záznam v diáři se bude vázat k nějakému datu a času.
Také bude obsahovat nějaký text. Např.:
12. ledna 2013 - Vyvenčit psa. To je asi vše, třída může
vypadat takto:
import java.time.LocalDateTime class Zaznam(var datumCas: LocalDateTime, var text: String) { override fun toString(): String { return "$datumCas $text" } }
Jelikož chceme do obou vlastností třídy zapisovat a i z nich
číst, postačí nám je deklarovat v parametru konstruktoru a nastavit je
pouze jako var. Další kolekce si představíme později v
samostatném kurzu na toto téma.
Třída v podstatě slouží jen k záznamu dat a nemá žádné metody (až
na toString()). Funkcionalitu jako takovou ale nenabízí.
Bystřejší si jistě všimli, že metoda toString() nijak
neformátuje datum a čas. K tomu se později ještě vrátíme.
Databáze
Aby se nám se záznamy snáze pracovalo, použijeme kolekci
List. Ta má totožné metody jako Array, ale dovoluje
nám navíc prvky i mazat.
Protože program bude o něco složitější, rozdělíme ho do více
objektů (vrstev). Záznam máme, nyní si vytvoříme objekt
Databaze, ve které budou záznamy uloženy. Bude mít privátní
kolekci List typu Zaznam. Databáze bude umožňovat
záznamy přidávat, mazat a vyhledávat podle data. K projektu tedy přidáme
třídu Databaze:
class Databaze { private var zaznamy: List<Zaznam> init { zaznamy = listOf() } }
Třída Databaze tedy slouží pro manipulaci s daty. Obsahuje
vnitřní kolekci zaznamy, ta se inicializuje v konstruktoru. Mohli
bychom použít i inicializaci bez konstruktoru, přímo u deklarace, ta by
vypadala takto:
class Databaze { private var zaznamy: List<Zaznam> = listOf() }
Dodejme třídě metody pro přidání, vymazání a vyhledání záznamu.
Přidání záznamu by mělo být jasné:
fun pridejZaznam(datumCas: LocalDateTime, text: String) {
zaznamy += Zaznam(datumCas, text)
}
Jako druhou metodu přidejme nalezení záznamů v daný den. Metoda bude
vracet List nalezených záznamů, protože jich pro ten den může
být v databázi více. Záznamy budeme moci vyhledávat podle data i času nebo
jen podle data. Můžeme tak najít záznamy v konkrétní den bez ohledu na to,
v jakou jsou hodinu. Podle čeho budeme chtít vyhledávat bude udávat parametr
dleCasu typu Boolean. Pokud bude false,
hledáme jen podle data bez ohledu na čas. List si nejprve
vytvoříme a poté do něj přidáváme záznamy, které odpovídají
hledanému datu. Odpovídat musí buď celé datum a čas (pokud hledáme i
podle času) nebo jen den, měsíc a rok (pokud hledáme jen podle data).
Naplněný List s nalezenými záznamy vrátíme.
fun najdiZaznamy(datum: LocalDateTime, dleCasu: Boolean): List<Zaznam> { var nalezene: List<Zaznam> = listOf() for (z in zaznamy) { if (((dleCasu) && (z.datumCas == datum))// dle času a data || (!dleCasu && z.datumCas.toLocalDate() == datum.toLocalDate()) // pouze dle data ) nalezene += z } return nalezene }
Použili jsme znalosti, které jsme se naučili z předchozích lekcí. V
případě hledání jen podle data (bez času) převedeme datumCas
na LocalDate a pak jen porovnáme pomocí ==, zda jsou
data stejná.
K dokonalosti bychom použili tzv. "high-order funkce", ale ty bohužel zatím neznáme.
Nakonec přidáme vymazání záznamů v určitou dobu. To provedeme pomocí
metody najdiZaznamy() a nalezené záznamy jednoduše odstraníme
pomocí operátoru -=. Budeme mazat podle přesného data i času,
2. parametr u metody najdiZaznamy() bude tedy
true:
fun vymazZaznamy(datum: LocalDateTime) { val nalezeno = najdiZaznamy(datum, true) zaznamy -= nalezeno }
Diář
Nyní si přidáme k projektu poslední třídu, bude to samotný diář.
Nazvěme ji Diar. Ten již bude obsahovat metody pro komunikaci s
uživatelem. Všimněte si, jak aplikaci rozdělujeme a jednotlivé její
části zapouzdřujeme. List je zapouzdřen v databázi, která nad
ním postavila další metody pro bezpečnou manipulaci s jeho obsahem. Samotnou
databázi nyní vložíme do diáře. Tím oddělíme logiku a práci s daty od
komunikace s uživatelem a dalšími vstupy/výstupy programu. Třída
Diar tedy bude komunikovat s uživatelem a data od něj předá
databázi.
Přidejme si privátní instanci databáze, kterou si vytvoříme v konstruktoru:
class Diar { private val databaze = Databaze() }
V příští lekci, Diář s databází v Kotlin - Dokončení, dokončíme třídu Diar spolu se
zprovozněním celé aplikace.

