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.