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í.

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.


 

Předchozí článek
Datum a čas v Kotlin - Parsování a porovnávání
Všechny články v sekci
Objektově orientované programování v Kotlin
Přeskočit článek
(nedoporučujeme)
Diář s databází v Kotlin - Dokončení
Článek pro vás napsal Samuel Kodytek
Avatar
Uživatelské hodnocení:
13 hlasů
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