Lekce 14 - Diář s databází v Kotlin

Kotlin Objektově orientované programování Diář s databází v Kotlin

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

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()
}

Třídu Diar dokončíme v příští lekci, Diář s databází v Kotlin - Dokončení, spolu se zprovozněním celé aplikace.


 

 

Článek pro vás napsal Samuel Kodytek
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
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 (4)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!