IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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.


 

Predchádzajúci článok
Dátum a čas v Kotlin - parsovanie a porovnávanie
Všetky články v sekcii
Objektovo orientované programovanie v Kotlin
Preskočiť článok
(neodporúčame)
Diár s databázou v Kotlin - Dokončenie
Článok pre vás napísal Samuel Kodytek
Avatar
Užívateľské hodnotenie:
1 hlasov
Autor se věnuje všem jazykům okolo JVM. Rád pomáhá lidem, kteří se zajímají o programování. Věří, že všichni mají šanci se naučit programovat, jen je potřeba prorazit tu bariéru, který se říká lenost.
Aktivity