13. diel - Diár s databázou v C #
V predchádzajúcom kvíze, Kvíz - Dedičnosť, statika, vlastnosti v C# .NET OOP, sme si overili nadobudnuté skúsenosti z predchádzajúcich lekcií.
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é 1468x (43.17 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#