Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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í.

13. diel - Diár s databázou v C #

V minulej lekcii, Kvíz - Dedičnosť, statika, vlastnosti v C# .NET OOP , sme si ukázali kolekciu List . Vieme, že nám oproti poli umožňuje pridávať nové prvky za behu programu a nemusíme sa starať o jeho veľkosť. Dnes si v C # tutoriálu do List u skúsime uložiť objekty.

Najprv som chcel urobiť 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. 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, ktorý pomenujeme Diar .

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. januára 2018 - vyvenčiť psa". To je asi všetko, trieda môže vyzerať takto:

class Zaznam
{
    public DateTime DatumCas { get; set; }
    public string Text { get; set; }

    public Zaznam (DateTime datumCas, string text)
    {
        DatumCas = datumCas;
        Text = text;
    }

    public override string ToString()
    {
        return DatumCas + " " + Text;
    }
}

Trieda v podstate slúži len k záznamu dát a nemá žiadne metódy (až na konštruktor a ToString() ). Všimnite si, že v konstruktoru už nemusíme používať this , ako sme boli zvyknutí u atribútov, pretože teraz sa jedná o vlastnosti s veľkými písmenami.

Databázy

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é. Opäť bude mať privátne List , ako mal Losovac . Ten bude teraz typu Zaznam . Diár bude umožňovať záznamy pridávať, mazať a vyhľadávať podľa dátumu. K projektu teda pridáme triedu Databaze . Bude veľmi podobná minulému Žrebovacie:

class Databaze
{
    private List<Zaznam> zaznamy;

    public Databaze()
    {
        zaznamy = new List<Zaznam>();
    }

}

Trieda teda slúži len 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 vo forme:

private List<Zaznam> zaznamy = new List<Zaznam>();

Dodajme triede metódy pre pridanie, vymazanie a vyhľadanie záznamu. Pridanie záznamu by malo byť jasné:

public void PridejZaznam(DateTime datumCas, string text)
{
    zaznamy.Add(new 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 bool . 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 časť Date , ak hľadáme len podľa dátumu. Naplnený List s nájdenými záznamami vrátime.

public List<Zaznam> NajdiZaznamy(DateTime datum, bool dleCasu)
{
    List<Zaznam> nalezene = new List<Zaznam>();
    foreach (Zaznam z in zaznamy)
    {
        if (((dleCasu) && (z.DatumCas == datum)) // podľa času a dátumu
        ||
        ((!dleCasu) && (z.DatumCas.Date == datum.Date))) // iba podľa dátumu
            nalezene.Add(z);
    }
    return nalezene;
}

Nakoniec pridáme vymazanie záznamov v určitú dobu. To vykonáme pomocou metódy NajdiZaznamy() a nájdené záznamy jednoducho proiterujeme az Listu odstránime. Budeme mazať podľa presného dátumu i času, 2. parameter u metódy NajdiZaznamy() bude teda true :

public void VymazZaznamy(DateTime datum)
{
    List<Zaznam> nalezeno = NajdiZaznamy(datum, true);
        foreach (Zaznam z in nalezeno)
                zaznamy.Remove(z);
}

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 Databaze databaze;

    public Diar()
    {
        databaze = new Databaze();
    }

}

Ako ďalšie pridajme pomocnú metódu ZjistiDatumCas() , ktorá vyzve používateľa na zadanie dátumu a času a vráti inštanciu DateTime nastavenú na túto hodnotu. Jediným bodom na premýšľanie je tu validácia vstupu od užívateľa:

private DateTime ZjistiDatumCas()
{
    Console.WriteLine("Zadajte dátum a čas v tvare [1.1.2012 14:00]:");
    DateTime datumCas;
    while (! DateTime.TryParse(Console.ReadLine(), out datumCas))
        Console.WriteLine("Chybné zadanie, zadajte znova dátum a čas: ");
    return datumCas;
}

Pridajme metódu VypisZaznamy() , ktorá nájde záznamy v daný deň a vypíše je:

public void VypisZaznamy(DateTime den)
{
    List<Zaznam> zaznamy = databaze.NajdiZaznamy(den, false);
    foreach (Zaznam z in zaznamy)
        Console.WriteLine(z);
}

Metóda pre vyzvanie užívateľov k vloženie parametrov nového záznamu a jeho pridanie do databázy bude nasledujúci:

public void PridejZaznam()
{
    DateTime datumCas = ZjistiDatumCas();
    Console.WriteLine("Zadajte text záznamu:");
    string text = Console.ReadLine();
    databaze.PridejZaznam(datumCas, text);
}

Zostáva záznamy vyhľadávať a mazať. Metóda na vyhľadanie vráti List s nájdenými záznamami (len podľa dátumu, presný čas nebude hrať úlohu). Vyzveme užívateľa na zadanie dátumu a to odovzdáme databázu. Výsledok zobrazíme.

public void VyhledejZaznamy()
{
    // Zadanie dátumu užívateľom
    DateTime datumCas = ZjistiDatumCas();
    // Vyhľadanie záznamov
    List<Zaznam> zaznamy = databaze.NajdiZaznamy(datumCas, false);
    // Výpis záznamov
    if (zaznamy.Count() > 0)
    {
        Console.WriteLine("Nájdené tieto záznamy: ");
        foreach (Zaznam z in zaznamy)
            Console.WriteLine(z);
    }
    else
        // Nenájdené
        Console.WriteLine("Neboli nájdené žiadne záznamy.");
}

Mazanie záznamov je triviálne:

public void VymazZaznamy()
{
    Console.WriteLine("Budú vymazané záznamy v daný deň a hodinu");
    DateTime datumCas = ZjistiDatumCas();
    databaze.VymazZaznamy(datumCas);
}

Ako posledný pridajme metódu pre vypísanie úvodnej obrazovky programu s aktuálnym dátumom a časom a udalosťami na dnešok a zajtrajšok.

public void VypisUvodniObrazovku()
{
    Console.Clear();
    Console.WriteLine("Vitajte v diári!");
    Console.WriteLine("Dnes je: {0}", DateTime.Now);
    Console.WriteLine();
    // výpis hlavnej obrazovky
    Console.WriteLine("Dnes:\n-----");
    VypisZaznamy(DateTime.Today);
    Console.WriteLine();
    Console.WriteLine("Zajtra:\n------");
    VypisZaznamy(DateTime.Now.AddDays(1));
    Console.WriteLine();
}

Môžeme víťazoslávne prejsť do Program.cs a vytvoriť inštanciu diáre. Tu umiestnime tiež hlavný cyklus programu s menu programu a reakcií na voľbu používateľa. Je to tá najvyššia vrstva programu:

static void Main(string[] args)
{
    // inštancie diáre
    Diar diar = new Diar();
    char volba = '0';
    // hlavný cyklus
    while (volba != '4')
    {
        diar.VypisUvodniObrazovku();
        Console.WriteLine();
        Console.WriteLine("Vyberte si akciu:");
        Console.WriteLine("1 - Pridať záznam");
        Console.WriteLine("2 - Vyhľadať záznamy");
        Console.WriteLine("3 - Vymazať záznam");
        Console.WriteLine("4 - Koniec");
        volba = Console.ReadKey().KeyChar;
        Console.WriteLine();
        // reakcia na voľbu
        switch (volba)
        {
            case '1':
                diar.PridejZaznam();
                break;
            case '2':
                diar.VyhledejZaznamy();
                break;
            case '3':
                diar.VymazZaznamy();
                break;
            case '4':
                Console.WriteLine("Ľubovoľnou klávesou ukončíte program...");
                break;
            default:
                Console.WriteLine("Neplatná voľba, stlačte ľubovoľný kláves a opakujte voľbu.");
                break;
        }
        Console.ReadKey();
    }
}

Kód výška nie je zložitý a už sme tu podobný mali veľakrát. Výslednú aplikáciu som na vyskúšanie požičal priateľku, tu vidíte výsledok :) :

Konzolová aplikácia
Vitajte v diári!
Dnes je: 13.6.2016 20:22:45

Dnes:
-----
13.6.2016 10:00:00 Shopping - Arkády Pankrác
13.6.2016 19:30:00 Vyvenčiť môjho yorkšírka Dennyho

Zajtra:
------
14.6.2016 14:00:00 Power plate

Vyberte si akciu:
1 - Pridať záznam
2 - Vyhľadať záznamy
3 - Vymazať záznam
4 - Koniec
2
Zadajte dátum a čas v tvare [1.1.2012 14:00]:
15.6.2016
Nájdené tieto záznamy:
15.6.2016 9:30:00 Skúška - Ekonomika cestovného ruchu

Týmto sme si List osvojili a bude nám pomerne dlho stačiť. Na záver by som dodal, že takto si môžete urobiť databázu čohokoľvek. Môžete použiť napr. Triedu Uzivatel z lekcie Vlastnosti alebo ktorúkoľvek inú triedu. Môžete ukladať články, úlohy, slony, čokoľvek, čo chcete v databáze spravovať. A čo ďalej? V budúcej lekcii, Riešené úlohy k 12.-13. lekciu OOP v C # .NET , to bude o rozhranie. V OOP nás toho čaká ešte dosť :)

V nasledujúcom cvičení, Riešené úlohy k 12.-13. lekciu OOP v C # .NET, si precvičíme nadobudnuté skúsenosti z predchádzajúcich lekcií.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 1463x (43.17 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Kvíz - Dedičnosť, statika, vlastnosti v C# .NET OOP
Všetky články v sekcii
Objektovo orientované programovanie v C #
Preskočiť článok
(neodporúčame)
Riešené úlohy k 12.-13. lekciu OOP v C # .NET
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
1 hlasov
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity