14. diel - Diár s databázou v Kotlin
V minulej lekcii, Dátum a čas v Kotlin - parsovanie a porovnávanie , sme si ukázali prácu s dátumom a časom. V
dnešnom Kotlin tutoriálu si skúsime uložiť objekty do kolekcie
List
a ďalej s nimi pracovať.
Najprv som chcel vytvoriť databázu užívateľov, ale užívateľa sme tu
už niekoľkokrát mali. Keďže sme sa nedávno naučili dátum a čas,
naprogramujeme si diár. Do databázy budeme ukladať jednotlivé záznamy a
vždy vypíšeme ten dnešný a zajtrajší. Databáza to nebude samozrejme tá
v tom pravom slova zmysle (na to ešte nemáme skúsenosti), ale bude sa jednať
práve o List
v operačnej pamäti počítača. Diár bude
umožňovať záznamy pridávať, hľadať je podľa dátumu a mazať podľa
dátumu a času. Založte si nový projekt, pomenujte ho napr.
Poznamkovac
, aby sa nevolal rovnako ako trieda Diar
,
ktorá v ňom neskôr tiež bude.
Záznam
Najprv si urobme triedu, ktorej inštancia budeme ukladať. Nazvime ju
Zaznam
. Záznam v diári sa bude viazať k nejakému dátumu a
času. Tiež bude obsahovať nejaký text. Napr .:
12. ledna 2013 - Vyvenčit psa
. To je asi všetko, trieda môže
vyzerať takto:
import java.time.LocalDateTime class Zaznam(var datumCas: LocalDateTime, var text: String) { override fun toString(): String { return "$datumCas $text" } }
Keďže chceme do oboch vlastností triedy zapisovať aiz nich
čítať, postačí nám ich deklarovať v parametri konstruktoru a nastaviť je
len ako var
. Ďalšie kolekcie si predstavíme neskôr v
samostatnom kurze na túto tému.
Trieda v podstate slúži len k záznamu dát a nemá žiadne metódy (až na
toString()
). Funkcionalitu ako takú ale neponúka. Bystrejší si
iste všimli, že metóda toString()
nijako neformátuje dátum a
čas. K tomu sa neskôr ešte vrátime.
Databázy
Aby sa nám so záznamami ľahšie pracovalo, použijeme
kolekciu List
. Tá má totožné metódy ako Array
,
ale dovoľuje nám navyše prvky i mazať.
Pretože program bude o niečo zložitejšie, rozdelíme ho do viacerých
objektov (vrstiev). Záznam máme, teraz si vytvoríme objekt
Databaze
, v ktorej budú záznamy uložené. Bude mať privátne
kolekciu List
typu Zaznam
. Databáza bude umožňovať
záznamy pridávať, mazať a vyhľadávať podľa dátumu. K projektu teda
pridáme triedu Databaze
:
class Databaze { private var zaznamy: List<Zaznam> init { zaznamy = listOf() } }
Trieda Databaze
teda slúži pre manipuláciu s dátami.
Obsahuje vnútorné kolekciu zaznamy
, tá sa inicializuje v
konstruktoru. Mohli by sme použiť aj inicializácii bez konstruktoru, priamo
pri deklarácia, tá by vyzerala takto:
class Databaze { private var zaznamy: List<Zaznam> = listOf() }
Dodajme triede metódy pre pridanie, vymazanie a vyhľadanie záznamu.
Pridanie záznamu by malo byť jasné:
fun pridejZaznam(datumCas: LocalDateTime, text: String) {
zaznamy += Zaznam(datumCas, text)
}
Ako druhú metódu pridajme nájdenie záznamov v daný deň. Metóda bude
vracať List
nájdených záznamov, pretože ich pre ten deň
môže byť v databáze viac. Záznamy budeme môcť vyhľadávať podľa
dátumu i času alebo len podľa dátumu. Môžeme tak nájsť záznamy v
konkrétny deň bez ohľadu na to, v akú sú hodinu. Podľa čoho budeme
chcieť vyhľadávať bude udávať parameter dleCasu
typu
Boolean
. Pokiaľ bude false
, hľadáme len podľa
dáta bez ohľadu na čas. List
si najprv vytvoríme a potom do
neho pridávame záznamy, ktoré zodpovedajú hľadanému dátume. Zodpovedať
musí buď celé dátum a čas (ak hľadáme aj podľa času) alebo len deň,
mesiac a rok (ak hľadáme len podľa dátumu). Naplnený List
s
nájdenými záznamami vrátime.
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 sme vedomosti, ktoré sme sa naučili z predchádzajúcich lekcií.
V prípade hľadania len podľa dátumu (bez času) prevedieme
datumCas
na LocalDate
a potom len porovnáme pomocou
==
, či sú dáta rovnaká.
K dokonalosti by sme použili tzv. "High-order funkcie", ale tie bohužiaľ zatiaľ nepoznáme.
Nakoniec pridáme vymazanie záznamov v určitú dobu. To vykonáme pomocou
metódy najdiZaznamy()
a nájdené záznamy jednoducho odstránime
pomocou operátora -=
. Budeme mazať podľa presného dátumu i
času, 2. parameter u metódy najdiZaznamy()
bude teda
true
:
fun vymazZaznamy(datum: LocalDateTime) { val nalezeno = najdiZaznamy(datum, true) zaznamy -= nalezeno }
Diár
Teraz si pridáme k projektu poslednej triedu, bude to samotný diár.
Nazvime ju Diar
. Ten už bude obsahovať metódy pre komunikáciu s
užívateľom. Všimnite si, ako aplikáciu rozdeľujeme a jednotlivé jej
časti zapuzdruje. List
je zapuzdrený v databáze, ktorá nad ním
postavila ďalšie metódy pre bezpečnú manipuláciu s jeho obsahom. Samotnú
databázu teraz vložíme do diára. Tým oddelíme logiku a prácu s dátami od
komunikácie s užívateľom a ďalšími vstupy / výstupy programu. Trieda
Diar
teda bude komunikovať s užívateľom a dáta od neho
odovzdá databázu.
Pridajme si privátne inštanciu databázy, ktorú si vytvoríme v konstruktoru:
class Diar { private val databaze = Databaze() }
Triedu Diar
dokončíme v budúcej lekcii, Diár s databázou v Kotlin - Dokončenie , spolu so
sprevádzkovaním celej aplikácie.