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#