Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

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

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

Dnes si v C# tutoriále do kolekcie List skúsime uložiť objekty.

Najprv som chcel urobiť databázu používateľov, ale použí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ť ich podľa dátumu a mazať podľa dátumu a času.

Založte si nový projekt, ktorý pomenujeme Diary.

Záznam

Najprv si urobme triedu, ktorej inštancie budeme ukladať. Nazvime ju Entry. Záznam v diári sa bude viazať k nejakému dátumu a času. Tiež bude obsahovať nejaký text. Napr.: "January 12, 2016 - Walk the dog". To je asi všetko, trieda môže vyzerať takto:

class Entry
{
    public DateTime Occurs { get; set; }
    public string Text { get; set; }

    public Entry (DateTime occurs, string text)
    {
        Occurs = occurs;
        Text = text;
    }

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

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

Databáza

Pretože program bude o niečo zložitejší, rozdelíme ho do viacerých objektov (vrstiev). Záznam máme, teraz si vytvoríme objekt Database, v ktorej budú záznamy uložené. Opäť bude mať privátny List, ako mal ListLottery. Ten bude teraz typu Entry. Diár bude umožňovať záznamy pridávať, mazať a vyhľadávať podľa dátumu. K projektu teda pridáme triedu Database. Bude veľmi podobná minulému Losovačovi:

class Database
{
    private List<Entry> entries;

    public Database()
    {
        entries = new List<Entry>();
    }

}

Trieda teda slúži iba na manipuláciu s dátami. Obsahuje vnútornú kolekciu entries, tá sa inicializuje v konštruktore. Mohli by sme použiť aj inicializáciu bez konštruktora priamo pri deklarácii vo forme:

private List<Entry> entries = new List<Entry>();

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

public void AddEntry(DateTime occurs, string text)
{
    entries.Add(new Entry(occurs, 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 byTime typu bool. Pokiaľ bude false, hľadáme len podľa dátumu bez ohľadu na čas. List si najskôr vytvoríme a potom do neho pridávame záznamy, ktoré zodpovedajú hľadanému dátumu. 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<Entry> FindEntries(DateTime date, bool byTime)
{
    List<Entry> found = new List<Entry>();
    foreach (Entry entry in entries)
    {
        if (((byTime) && (entry.Occurs == date)) // filtered by time and date
        ||
        ((!byTime) && (entry.Occurs.Date == date.Date))) // filtered by date only
            found.Add(entry);
    }
    return found;
}

Nakoniec pridáme vymazanie záznamov v určitú dobu. To urobíme pomocou metódy FindEntries() a nájdené záznamy jednoducho proiterujeme a z kolekcie List odstránime. Budeme mazať podľa presného dátumu i času, druhý parameter pri metóde FindEntries() bude teda true:

public void DeleteEntries(DateTime date)
{
    List<Entry> found = FindEntries(date, true);
    foreach (Entry entry in found)
        entries.Remove(entry);
}

Diár

Teraz si pridáme k projektu poslednú triedu, bude to samotný diár. Nazvime ju Diary. Ten už bude obsahovať metódy na komunikáciu s užívateľom. Všimnite si, ako aplikáciu rozdeľujeme a jednotlivé jej časti zapuzdrujeme. 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 vstupmi/výstupmi programu. Trieda Diary teda bude komunikovať s užívateľom a dáta od neho odovzdá databázu.

Pridajme si privátnu inštanciu databázy, ktorú si vytvoríme v konštruktore:

class Diary
{

    private Database database;

    public Diary()
    {
        database = new Database();
    }

}

Ako ďalšiu pridajme pomocnú metódu ReadDateTime(), ktorá vyzve uží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 ReadDateTime()
{
    Console.WriteLine("Enter date and time as e.g. [01.12.2016 14:00]:");
    DateTime dateTime;
    while (!DateTime.TryParse(Console.ReadLine(), out dateTime))
        Console.WriteLine("Error. Please try again: ");
    return dateTime;
}

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

public void PrintEntries(DateTime day)
{
    List<Entry> entries = database.FindEntries(day, false);
    foreach (Entry entry in entries)
        Console.WriteLine(entry);
}

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

public void AddEntry()
{
    DateTime dateTime = ReadDateTime();
    Console.WriteLine("Enter the entry text:");
    string text;
    while (string.IsNullOrWhiteSpace(text = Console.ReadLine()))
    {
        Console.WriteLine("Enter again:");
    }
    database.AddEntry(dateTime, text);
}

Metóda IsNullOrWhiteSpace()

Pomocou metódy IsNullOrWhiteSpace() ošetríme situácie, keď používateľ nič nezadá alebo zadá len pár medzier. Ak sa tak stane, tak používateľa vyzveme pre nové zadanie textu. Táto metóda vracia hodnotu true, keď reťazec, ktorý jej odovzdáme, má hodnotu null, je prázdny alebo obsahuje iba medzery. Môžete ju vo svojich programoch takto využívať.

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ť rolu). Vyzveme užívateľa na zadanie dátumu a to odovzdáme databáze. Výsledok zobrazíme:

public void SearchEntries()
{
    // Entering the date by user
    DateTime dateTime = ReadDateTime();
    // Searching for entries
    List<Entry> entries = database.FindEntries(dateTime, false);
    // Printing entries
    if (entries.Count() > 0)
    {
        Console.WriteLine("Entries found: ");
        foreach (Entry entry in entries)
            Console.WriteLine(entry);
    }
    else
        // Nothing found
        Console.WriteLine("No entries were found.");
}

Mazanie záznamov je triviálne:

public void DeleteEntries()
{
    Console.WriteLine("Entries with the same exact date and time will be deleted");
    DateTime dateTime = ReadDateTime();
    database.DeleteEntries(dateTime);
}

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

public void PrintHomeScreen()
{
    Console.Clear();
    Console.WriteLine("Welcome to your virtual diary!");
    Console.WriteLine("Today is: {0}", DateTime.Now);
    Console.WriteLine();
    // printing the home screen
    Console.WriteLine("Today:\n------");
    PrintEntries(DateTime.Today);
    Console.WriteLine();
    Console.WriteLine("Tomorrow:\n---------");
    PrintEntries(DateTime.Now.AddDays(1));
    Console.WriteLine();
}

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

static void Main(string[] args)
{
    // diary instance
    Diary diary = new Diary();
    char choice = '0';
    // main loop
    while (choice != '4')
    {
        diary.PrintHomeScreen();
        Console.WriteLine();
        Console.WriteLine("Choose an action:");
        Console.WriteLine("1 - Add an entry");
        Console.WriteLine("2 - Search for entries");
        Console.WriteLine("3 - Delete entries");
        Console.WriteLine("4 - End");
        choice = Console.ReadKey().KeyChar;
        Console.WriteLine();
        // reaction to the choice
        switch (choice)
        {
            case '1':
                diary.AddEntry();
                break;
            case '2':
                diary.SearchEntries();
                break;
            case '3':
                diary.DeleteEntries();
                break;
            case '4':
                Console.WriteLine("Press any key to quit the program...");
                break;
            default:
                Console.WriteLine("Error. Press any key to choose another action.");
                break;
        }
        Console.ReadKey();
    }
}

Kód vyššie 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ľke, tu vidíte výsledok :) :

Konzolová aplikácia
Welcome to diary!
Today is: 5/12/2016 11:34:55

Today:
-----
5/12/2016 10:00:00 Shopping - Pankrac Arcade
5/12/2016 7:30:00 PM - Pet my Yorkshire Terrier Fred

Tomorrow:
--------
5/13/2016 2:00:00 PM Go jogging


Choose an action:
1 - Add an entry
2 - Search for entries
3 - Delete entries
4 - End
2
Enter date and time as e.g. [1.12.2016 10:00]
5/15/2016
Found entries:
5/15/2016 9:30:00 Economy exam

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 User 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, Rozhranie (interface), to bude o rozhraní. V OOP nás toho čaká ešte dosť :)


 

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é 4x (66.57 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Riešené úlohy k 12.-13. lekcii OOP v C# .NET
Všetky články v sekcii
Objektovo orientované programovanie v C# .NET
Preskočiť článok
(neodporúčame)
Rozhranie (interface)
Č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