Lekce 16 - Diář s databází v C#
V předešlém cvičení, Řešené úlohy k 14.-15. lekci OOP v C# .NET, jsme si procvičili nabyté zkušenosti z předchozích lekcí.
Dnes si v C# tutoriálu zkusíme do kolekce List uložit
objekty.
Nejprve jsme chtěli vytvořit databázi uživatelů, ale uživatele jsme tu
již několikrát měli. Jelikož jsme se nedávno naučili práci s datem a
časem, naprogramujeme si diář. Do databáze budeme ukládat jednotlivé
záznamy a vždy vypíšeme ten dnešní a zítřejší. Samozřejmě nepůjde o
databázi v pravém slova smyslu (na ni ještě nemáme zkušenosti), ale bude
se jednat právě o List v operační paměti počítače.
List bude umožňovat záznamy přidávat, vyhledávat je podle
data a mazat podle data a času.
Založme si nový projekt, který pojmenujeme Diar.
Záznam
Nejprve si vytvořme 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 2018 - Vyvenčit psa".
Třída může vypadat 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; } }
Třída v podstatě slouží jen k záznamu dat a nemá žádné metody (až
na konstruktor a ToString()). Všimněme si, že v konstruktoru
již nemusíme používat this, jak jsme byli zvyklí u atributů,
protože nyní se jedná o vlastnosti s velkými písmeny.
Databáze
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. Opět bude mít
privátní List, jako měl Losovac. List bude nyní
typu Zaznam. Diář bude umožňovat záznamy přidávat, mazat a
vyhledávat podle data. K projektu tedy přidáme třídu Databaze.
Bude velmi podobná minulé třídě Losovac:
class Databaze { private List<Zaznam> zaznamy; public Databaze() { zaznamy = new List<Zaznam>(); } }
Třída tedy slouží pouze k manipulaci s daty. Obsahuje vnitřní kolekci
zaznamy, jež se inicializuje v konstruktoru. Mohli bychom použít
i inicializaci bez konstruktoru přímo u deklarace ve formě:
private List<Zaznam> zaznamy = new List<Zaznam>();
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é:
public void PridejZaznam(DateTime datumCas, string text) { zaznamy.Add(new 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 daný 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 bool. Bude-li parametr
false, budeme hledat jen podle data bez ohledu na čas.
List si nejprve vytvoříme, teprve poté do něj přidáváme
záznamy, které odpovídají hledanému datu. Odpovídat musí buď celé datum
i čas (hledáme-li i podle času), nebo pouze část Date
(hledáme-li jen podle data). Naplněný List s nalezenými
záznamy vrátíme.
public List<Zaznam> NajdiZaznamy(DateTime datum, bool dleCasu) { List<Zaznam> nalezene = new List<Zaznam>(); foreach (Zaznam z in zaznamy) { if (((dleCasu) && (z.DatumCas == datum)) // dle času a data || ((!dleCasu) && (z.DatumCas.Date == datum.Date))) // pouze dle data nalezene.Add(z); } return nalezene; }
Nakonec přidáme vymazání záznamů v určitou dobu. To provedeme pomocí
metody NajdiZaznamy(). Nalezené záznamy poté jednoduše
proiterujeme a z Listu odstraníme. Budeme mazat podle přesného
data i času, druhým parametrem u metody NajdiZaznamy() tedy bude
true:
public void VymazZaznamy(DateTime datum) { List<Zaznam> nalezeno = NajdiZaznamy(datum, true); foreach (Zaznam z in nalezeno) zaznamy.Remove(z); }
Diář
Nyní si přidáme k projektu poslední třídu, bude to samotný diář.
Nazvěme ji Diar. Třída již bude obsahovat metody pro komunikaci
s uživatelem. Všimněme 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 Databaze databaze; public Diar() { databaze = new Databaze(); } }
Jako další přidejme pomocnou metodu ZjistiDatumCas(), která
vyzve uživatele k zadání data a času a vrátí instanci
DateTime nastavenou na tuto hodnotu. Jediným bodem k
přemýšlení je zde validace vstupu od uživatele:
private DateTime ZjistiDatumCas() { Console.WriteLine("Zadejte datum a čas ve tvaru [1.1.2012 14:00]:"); DateTime datumCas; while (! DateTime.TryParse(Console.ReadLine(), out datumCas)) Console.WriteLine("Chybné zadání, zadejte znovu datum a čas: "); return datumCas; }
Přidejme metodu VypisZaznamy(), která najde záznamy v daný
den a vypíše je:
public void VypisZaznamy(DateTime den) { List<Zaznam> zaznamy = databaze.NajdiZaznamy(den, false); foreach (Zaznam z in zaznamy) Console.WriteLine(z); }
Metoda pro vyzvání uživatele ke vložení parametrů nového záznamu a přidání záznamu do databáze bude následující:
public void PridejZaznam() { DateTime datumCas = ZjistiDatumCas(); Console.WriteLine("Zadejte text záznamu:"); string text; while (string.IsNullOrWhiteSpace(text = Console.ReadLine())) { Console.WriteLine("Zadej text znovu:"); } databaze.PridejZaznam(datumCas, text); }
IsNullOrWhiteSpace
Pomocí metody IsNullOrWhiteSpace() ošetříme situace, kdy
uživatel nic nezadá nebo zadá jen pár mezer. Jestliže se tak stane,
uživatele vyzveme k novému zadání textu. Tato metoda vrací hodnotu
true, jestliže řetězec, který jí předáme, má hodnotu
null, je prázdný nebo obsahuje jen mezery. Metodu můžete takto
ve svých programech využívat.
Zbývá záznamy vyhledávat a mazat. Metoda k vyhledání vrátí
List s nalezenými záznamy (jen podle data, přesný čas nebude
hrát roli). Vyzveme uživatele k zadání data, které předáme databázi.
Výsledek zobrazíme.
public void VyhledejZaznamy() { // Zadání data uživatelem DateTime datumCas = ZjistiDatumCas(); // Vyhledání záznamů List<Zaznam> zaznamy = databaze.NajdiZaznamy(datumCas, false); // Výpis záznamů if (zaznamy.Count() > 0) { Console.WriteLine("Nalezeny tyto záznamy: "); foreach (Zaznam z in zaznamy) Console.WriteLine(z); } else // Nenalezeno Console.WriteLine("Nebyly nalezeny žádné záznamy."); }
Mazání záznamů je triviální:
public void VymazZaznamy() { Console.WriteLine("Budou vymazány záznamy v daný den a hodinu"); DateTime datumCas = ZjistiDatumCas(); databaze.VymazZaznamy(datumCas); }
Jako poslední přidejme metodu pro vypsání úvodní obrazovky programu s aktuálním datem a časem a událostmi na dnešek a zítřek.
public void VypisUvodniObrazovku() { Console.Clear(); Console.WriteLine("Vítejte v diáři!"); Console.WriteLine("Dnes je: {0}", DateTime.Now); Console.WriteLine(); // výpis hlavní obrazovky Console.WriteLine("Dnes:\n-----"); VypisZaznamy(DateTime.Today); Console.WriteLine(); Console.WriteLine("Zítra:\n------"); VypisZaznamy(DateTime.Now.AddDays(1)); Console.WriteLine(); }
Můžeme vítězoslavně přejít do Program.cs a vytvořit
instanci diáře. Zde umístíme také hlavní cyklus programu s menu programu a
reakcí na uživatelovu volbu. Je to ta nejvyšší vrstva programu:
static void Main(string[] args) { // instance diáře Diar diar = new Diar(); char volba = '0'; // hlavní cyklus while (volba != '4') { diar.VypisUvodniObrazovku(); Console.WriteLine(); Console.WriteLine("Vyberte si akci:"); Console.WriteLine("1 - Přidat záznam"); Console.WriteLine("2 - Vyhledat záznamy"); Console.WriteLine("3 - Vymazat záznam"); Console.WriteLine("4 - Konec"); volba = Console.ReadKey().KeyChar; Console.WriteLine(); // reakce na volbu switch (volba) { case '1': diar.PridejZaznam(); break; case '2': diar.VyhledejZaznamy(); break; case '3': diar.VymazZaznamy(); break; case '4': Console.WriteLine("Libovolnou klávesou ukončíte program..."); break; default: Console.WriteLine("Neplatná volba, stiskněte libovolnou klávesu a opakujte volbu."); break; } Console.ReadKey(); } }
Kód výše není složitý a již jsme tu podobný měli mnohokrát.
Výslednou aplikaci jsem na vyzkoušení půjčil přítelkyni, zde vidíte
výsledek
:
Konzolová aplikace
Vítejte v diáři!
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čit mého yorkšírka Dennyho
Zítra:
------
14.6.2016 14:00:00 Power plate
Vyberte si akci:
1 - Přidat záznam
2 - Vyhledat záznamy
3 - Vymazat záznam
4 - Konec
2
Zadejte datum a čas ve tvaru [1.1.2012 14:00]:
15.6.2016
Nalezeny tyto záznamy:
15.6.2016 9:30:00 Zkouška - Ekonomika cestovního ruchu
Tímto jsme si List osvojili a bude nám poměrně dlouho
stačit. Na závěr dodejme, že takto si můžete udělat databázi čehokoli.
Můžete použít např. třídu Uzivatel z lekce Vlastnosti
nebo kteroukoli jinou třídu. Můžete ukládat články, úlohy, slony,
cokoli, co chcete v databázi spravovat. A co dál?
V příští lekci, Rozhraní (interface), si probereme rozhraní. V OOP nás toho čeká
ještě dost 
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 1590x (43.17 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

David se informační technologie naučil na