Lekce 16 - Diář s databází v Javě (dokončení)
V minulé lekci, Diář s databází v Javě, jsme rozpracovali jednoduchý diář s databází pomocí ArrayListu.
V dnešním tutoriálu aplikaci dokončíme.
Do třídy Diar přidejme dvě pomocné metody zjistiDatumCas() a zjistiDatum(), které vyzvou uživatele k zadání data (a případně času) a vrátí instanci LocalDateTime nastavenou na tuto hodnotu. Nejprve si metody ukažme, záhy si je popíšeme:
private LocalDateTime zjistiDatumCas() { System.out.println("Zadejte datum a čas ve tvaru [1.1.2013 14:00]:"); while (true) { try { return LocalDateTime.parse(sc.nextLine(), FORMAT_DATA); } catch (Exception ex) { System.out.println("Nesprávně zadáno, zadejte prosím znovu"); } } } private LocalDateTime zjistiDatum() { System.out.println("Zadejte datum ve tvaru [1.1.2013]:"); while (true) { try { return LocalDate.parse(sc.nextLine(), FORMAT_DATA_BEZ_CASU).atStartOfDay(); } catch (Exception ex) { System.out.println("Nesprávně zadáno, zadejte prosím znovu"); } } }
Metody fungují téměř identicky. Jediný rozdíl je v třídě, která volá metodu parse(). V případě načtení data a času použijeme třídu LocalDateTime a formát FORMAT_DATA. V případě načtení pouze datumu musíme použít třídu LocalDate a formát FORMAT_DATA_BET_CASU. To nám ale vrátí instanci třídy LocalDate. Musíme tedy ještě zavolat metodu atStartOfDay(), abychom vrátili instanci třídy LocalDateTime. Celé čtení je zabaleno do nekonečné smyčky (viz while (true)). Tím docílíme, že budeme načítat vstup od uživatele do té doby, než zadá validní vstup. Parsování vstupu je ještě zabaleno do try-catch bloku. V případě nevalidního vstupu informujeme uživatele, že musí vstup zadat znovu.
Pomocí zjistiDatumCas() budeme zadávat datum a čas, pomocí zjistiDatum() budeme zadávat pouze datum. Druhá metoda bude sloužit k vyhledávání záznamů v určitý den, jelikož určitě nebudeme chtít vypsat záznam v danou hodinu a minutu, ale záznamy v daný den bez určení času.
Do třídy si přidejme 2 veřejné, statické konstanty. Budou to formattery data a času. Statické proto, aby byly použitelné i pro další třídy v naší aplikaci. Každá třída může používat tyto formattery, které máme definované na jednom místě.
public static final DateTimeFormatter FORMAT_DATA = DateTimeFormatter.ofPattern("d'.'M'.'y H:mm"); public static final DateTimeFormatter FORMAT_DATA_BEZ_CASU = DateTimeFormatter.ofPattern("d'.'M'.'y");
Jeden formatter obsahuje datum i čas, jeden pouze datum bez času. Přejděme do třídy Zaznam.java a metodu toString() pozměňme takto:
@Override public String toString() { return Diar.FORMAT_DATA.format(datumCas) + " " + text; }
Kdybychom si dělali instanci formatteru znovu v každém záznamu, bylo by to nepraktické. Takto máme formattery na jednom místě a když se rozhodneme formát změnit, změníme ho jen ve třídě Diar. Se statikou ale opatrně, ne vždy ji je vhodné použít.
Přidejme metodu vypisZaznamy(), která najde záznamy v daný den a vypíše je:
public void vypisZaznamy(LocalDateTime den) { ArrayList<Zaznam> zaznamy = databaze.najdiZaznamy(den, false); for (Zaznam z : zaznamy) { System.out.println(z); } }
Metoda pro vyzvání uživatele k vložení parametrů nového záznamu a jeho přidání do databáze bude následující:
public void pridejZaznam() { LocalDateTime datumCas = zjistiDatumCas(); System.out.println("Zadejte text záznamu:"); String text = sc.nextLine(); databaze.pridejZaznam(datumCas, text); }
Zbývá záznamy vyhledávat a mazat. Metoda k vyhledání vrátí ArrayList s nalezenými záznamy (jen podle data, přesný čas nebude hrát roli). Vyzveme uživatele k zadání data a to předáme databázi. Výsledek zobrazíme.
public void vyhledejZaznamy() { // Zadání data uživatelem LocalDateTime datumCas = zjistiDatum(); // Vyhledání záznamů ArrayList<Zaznam> zaznamy = databaze.najdiZaznamy(datumCas, false); // Výpis záznamů if (zaznamy.size() > 0) { System.out.println("Nalezeny tyto záznamy: "); for (Zaznam z : zaznamy) { System.out.println(z); } } else { // Nenalezeno System.out.println("Nebyly nalezeny žádné záznamy."); } }
Mazání záznamů je triviální:
public void vymazZaznamy() { System.out.println("Budou vymazány záznamy v daný den a hodinu"); LocalDateTime 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() { System.out.println(); System.out.println(); System.out.println("Vítejte v diáři!"); LocalDateTime dnes = LocalDateTime.now(); System.out.printf("Dnes je: %s\n", FORMAT_DATA.format(dnes)); System.out.println(); // výpis hlavní obrazovky System.out.println("Dnes:\n-----"); vypisZaznamy(dnes); System.out.println(); System.out.println("Zítra:\n------"); LocalDateTime zitra = LocalDateTime.now().plusDays(1); vypisZaznamy(zitra); System.out.println(); }
Můžeme vítězoslavně přejít do Poznamkovac.java a vytvořit instanci diáře. Zde umístíme také hlavní cyklus programu s menu programu a reakcí na volbu uživatele. Je to ta nejvyšší vrstva programu:
public static void main(String[] args) { Scanner sc = new Scanner(System.in, "Windows-1250"); Diar diar = new Diar(); String volba = ""; // hlavní cyklus while (!volba.equals("4")) { diar.vypisUvodniObrazovku(); System.out.println(); System.out.println("Vyberte si akci:"); System.out.println("1 - Přidat záznam"); System.out.println("2 - Vyhledat záznamy"); System.out.println("3 - Vymazat záznam"); System.out.println("4 - Konec"); volba = sc.nextLine(); System.out.println(); // reakce na volbu switch (volba) { case "1": diar.pridejZaznam(); break; case "2": diar.vyhledejZaznamy(); break; case "3": diar.vymazZaznamy(); break; case "4": System.out.println("Libovolnou klávesou ukončíte program..."); break; default: System.out.println("Neplatná volba, stiskněte libovolnou klávesu a opakujte volbu."); break; } } }
Kód výše není složitý a již jsme tu podobný měli mockrá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
Dnes:
-----
13.6.2016 10:00 Shopping - Arkády Pankrác
13.6.2016 19:30 Vyvenčit mého yorkšírka Dennyho
Zítra:
------
14.6.2016 14:00 Power plate
Vyberte si akci:
1 - Přidat záznam
2 - Vyhledat záznamy
3 - Vymazat záznam
4 - Konec
2
Zadejte datum ve tvaru [1.1.2012]:
15.6.2016
Nalezeny tyto záznamy:
15.6.2016 9:30 Zkouška - Ekonomika cestovního ruchu
Tímto jsme si ArrayList osvojili a bude nám poměrně dlouho stačit. Na závěr bych dodal, že takto si můžete udělat databázi čehokoli. Můžete použít např. třídu Uzivatel z lekce Gettery a settery v Javě 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) v Javě, to bude o rozhraní. V OOP nás toho čeká
ještě dost .
Stáhnout
Staženo 733x (34.43 kB)
Aplikace je včetně zdrojových kódů v jazyce java
Komentáře


Zobrazeno 10 zpráv z 19. Zobrazit vše