Lekce 14 - Diář s databází v C#
V předešlém cvičení, Řešené úlohy k 12.-13. 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 1535x (43.17 kB)
Aplikace je včetně zdrojových kódů v jazyce C#