13. diel - Diár s databázou vo VB.NET
V minulej lekcii, List vo Visual Basic .NET , 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 vo VB.NET tutoriálu do Listu 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.
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 2013 - vyvenčiť psa. To je asi všetko, trieda môže vyzerať takto:
Class Zaznam Public Property DatumCas As DateTime Public Property Text As String Public Sub New(datumCas As DateTime, text As String) Me.DatumCas = datumCas Me.Text = text End Sub Public Overrides Function ToString() As String Return DatumCas & " " & Text End Function End Class
Trieda v podstate slúži len k záznamu dát a nemá žiadne metódy (až na konštruktor a toString ()).
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 žrebovacie. 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 zaznamy As List(Of Zaznam) Public Sub New() zaznamy = New List(Of Zaznam)() End Sub End Class
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 zaznamy As New List(Of Zaznam)
Dodajme triede metódy pre pridanie, vymazanie a vyhľadanie záznamu.
Pridanie záznamu by malo byť jasné:
Public Sub PridejZaznam(datumCas As DateTime, text As String) zaznamy.Add(New Zaznam(datumCas, text)) End Sub
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 Boolean. 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ť .dat, ak hľadáme len podľa dátumu. Naplnený List s nájdenými záznamami vrátime.
Public Function NajdiZaznamy(datum As DateTime, dleCasu As Boolean) As List(Of Zaznam) Dim nalezene As New List(Of Zaznam)() For Each z As Zaznam In zaznamy ' dle času a data If ((dleCasu) AndAlso (z.DatumCas = datum)) OrElse ((Not dleCasu) AndAlso (z.DatumCas.[Date] = datum.[Date])) Then ' pouze dle data nalezene.Add(z) End If Next Return nalezene End Function
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 Sub VymazZaznamy(datum As DateTime) Dim nalezeno As List(Of Zaznam) = NajdiZaznamy(datum, True) For Each z As Zaznam In nalezeno zaznamy.Remove(z) Next End Sub
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 As Databaze Public Sub New() databaze = New Databaze() End Sub End Class
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 Function ZjistiDatumCas() As DateTime Console.WriteLine("Zadejte datum a čas ve tvaru [1.1.2012 14:00]:") Dim datumCas As DateTime While Not DateTime.TryParse(Console.ReadLine(), datumCas) Console.WriteLine("Chybné zadání, zdajte znovu datum a čas: ") End While Return datumCas End Function
Pridajme metódu VypisZaznamy (), ktorá nájde záznamy v daný deň a vypíše je:
Public Sub VypisZaznamy(den As DateTime) Dim zaznamy As List(Of Zaznam) = databaze.NajdiZaznamy(den, False) For Each z As Zaznam In zaznamy Console.WriteLine(z) Next End Sub
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 Sub PridejZaznam() Dim datumCas As DateTime = ZjistiDatumCas() Console.WriteLine("Zadejte text záznamu:") Dim text As String = Console.ReadLine() databaze.PridejZaznam(datumCas, text) End Sub
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 Sub VyhledejZaznamy() ' Zadání data uživatelem Dim datumCas As DateTime = ZjistiDatumCas() ' Vyhledání záznamů Dim zaznamy As List(Of Zaznam) = databaze.NajdiZaznamy(datumCas, False) ' Výpis záznamů If zaznamy.Count() > 0 Then Console.WriteLine("Nalezeny tyto záznamy: ") For Each z As Zaznam In zaznamy Console.WriteLine(z) Next Else ' Nenalezeno Console.WriteLine("Nebyly nalezeny žádné záznamy.") End If End Sub
Mazanie záznamov je triviálne:
Public Sub VymazZaznamy() Console.WriteLine("Budou vymazány záznamy v daný den a hodinu") Dim datumCas As DateTime = ZjistiDatumCas() databaze.VymazZaznamy(datumCas) End Sub
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 Sub 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:{0}-----", vbCrLf) VypisZaznamy(DateTime.Today) Console.WriteLine() Console.WriteLine("Zítra:{0}------", vbCrLf) VypisZaznamy(DateTime.Now.AddDays(1)) Console.WriteLine() End Sub
Môžeme víťazoslávne prejsť do Module1.vb 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:
Sub Main() ' instance diáře Dim diar As New Diar() Dim volba As Char = "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 Select Case volba Case "1" diar.PridejZaznam() Case "2" diar.VyhledejZaznamy() Case "3" diar.VymazZaznamy() Case "4" Console.WriteLine("Libovolnou klávesou ukončíte program...") Case Else Console.WriteLine("Neplatná volba, stiskněte libovolnou klávesu a opakujte volbu.") End Select Console.ReadKey() End While End Sub
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
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 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? Budúci lekcie, Riešené úlohy k 12.-13. lekciu OOP vo Visual Basic .NET , 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 vo Visual Basic .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é 277x (69.31 kB)
Aplikácia je vrátane zdrojových kódov v jazyku VB