PHP týden Letní akce
Pouze tento týden sleva až 80 % na kurzy PHP. Lze kombinovat s akcí Letní slevy na prémiový obsah!
Brno? Vypsali jsme pro vás nové termíny školení Základů programování a OOP v Brně!

Lekce 5 - Uložení objektů do CSV v Javě část 2

Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem.
Vydávání, hosting a aktualizace umožňují jeho sponzoři.

V minulé lekci, Uložení objektů do CSV v Javě, jsme načali databázi uživatelů pomocí CSV souborů. Nyní aplikaci dokončíme a doladíme.

Načtení uživatelů z CSV souboru

Uložení nám funguje, zbývá umět data opětovně načíst. Soubor budeme číst řádek po řádku, každý řádek rozdělíme metodou split() a následně do kolekce přidáme objekt s příslušnými hodnotami. Před načtením si kolekci vyprázdníme, aby v ní nebyli i uživatelé načtení někdy dříve (kdyby se aplikace někdy rozšiřovala).

public void nacti() throws IOException {
    uzivatele.clear();
    // Otevře soubor pro čteni
    try (BufferedReader br = new BufferedReader(new FileReader(soubor))) {
        String s;
        // Čteme řádek po řádku
        while ((s = br.readLine()) != null) {
            // Rozdělí řetězec řádku podle středníků
            String[] rozdeleno = s.split(";");
            String jmeno = rozdeleno[0];
            int vek = Integer.parseInt(rozdeleno[1]);
            LocalDate registrovan = LocalDate.parse(rozdeleno[2]);
            // Přidá uživatele s danými hodnotami
            pridejUzivatele(jmeno, vek, registrovan);
        }
    }
}

Třída databáze je tedy kompletní. Nyní se zaměříme na formulářovou část.

Prezentační vrstva aplikace

Jako první si připravíme nové formulářové prvky (komponenty z ToolBoxu). Přidáme tlačítko načíst, dále JListView listUzivatelu. Dále JTextField na jméno nového uživatele, JSpinner na jeho věk a JFormattedTextField na datum registrace. Ke komponentám přidáme i nějaké labely. Tyto prvky můžeme seskupit do panelu. V dalším panelu budou 3 labely na detail uživatele, ty pojmenujeme jmenoJLabel, vekJLabel a registrovanJLabel. Další 3 labely přidáme jako jejich popisek. Nakonec přidáme tlačítko k přidání uživatele. Pokud to bylo moc rychlé, nezoufejte, tady je obrázek výsledného formuláře:

Formulář databáze uživatelů v CSV

V reálu by bylo přidání uživatelů pravděpodobně přítomno v dalším formuláři, který by se zobrazoval jako dialog, ale nám to bude v tutoriálu stačit takto.

Z tlačítka "Uložit" odstraníme vytvoření testovacích uživatelů. Samotné uložení nyní vložíme do try-catch bloku. Víme totiž, že finally (tedy TWR blok v naší databázi) výjimky nepohlcuje, což také chceme a budeme na ně reagovat ve formulářové části, kam reakce logicky patří. Upozornění na chybu, tedy komunikace s uživatelem, přímo ve třídě Databaze by bylo špatně. Po zachycení výjimky zobrazíme JOptionPane s chybou. Metoda tlačítka bude tedy vypadat takto:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
    try {
        databaze.uloz();
    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, "Databázi se nepodařilo uložit, zkontrolujte přístupová práva k souboru.");
    }
}

Obdobně naklikneme metodu tlačítka "Načíst". V reálu by se načtení vykonalo asi automaticky po spuštění aplikace a uložení po ukončení, pro názornost si to však ponecháme na tlačítkách. Metoda tlačítka "Načíst" tedy vypadá takto:

private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
    try {
        databaze.nacti();
    } catch (IOException ex) {
        JOptionPane.showMessageDialog(null, "Databázi se nepodařilo načíst, soubor zřejmě neexisituje.");
    }
}

Nyní zpracujeme kliknutí na listUzivatelu, které provede zobrazení detailu uživatele do připravených labelů:

private void listUzivateluValueChanged(javax.swing.event.ListSelectionEvent evt) {
    Uzivatel uzivatel = listUzivatelu.getSelectedValue();
    if (uzivatel != null) {
        jmenoJLabel.setText(uzivatel.getJmeno());
        vekJLabel.setText(String.valueOf(uzivatel.getVek()));
        registrovanJLabel.setText(uzivatel.getRegistrovan().toString());
    }
}

Kód jsme opodmínkovali pro případ, že by nebyl žádný uživatel vybrán (list by byl prázdný).

Poslední tlačítko bez metody je Přidání nového uživatele. Rozklikneme ho tedy, vložení bude velmi jednoduché. Stačí uživatele přidat do databáze a ta se o vše postará:

private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
    String jmeno = jmenoJTextField.getText();
    int vek = (int) vekJSpinner.getModel().getValue();
    LocalDate registrovan = LocalDate.parse(
            registrovanJFormattedTextField.getText(),
            DateTimeFormatter.ofPattern("d'.'M'.'y"));
    databaze.pridejUzivatele(jmeno, vek, registrovan);
}

Zkusíme přidat nového uživatele:

Formulář databáze uživatelů v CSV

Podobně bychom si mohli napsat i mazání uživatelů, ale to již nechám na vás.

Naše aplikace je téměř hotová, ještě se zamyslíme nad tím, co se stane, když někdo do jména vloží středník. Aplikace se rozbije. Proto budeme v metodě uloz() středníky ze jména odstraňovat. Kdybychom dělali aplikaci, kde bychom je potřebovali (což se nestává příliš často), můžeme vybrat jiný zástupný znak. Pokud bychom chtěli být dokonalí, vložíme takovou hodnotu se středníkem do uvozovek. Poté se však již nejedná o jednoduché CSV a metoda split() nám přestane stačit. Dále by se to samozřejmě dalo řešit jiným formátem. My si tedy středníky pouze odstraňme, přesněji je nahradíme mezerami změnou jediného řádku v metodě uloz():

String[] hodnoty = {u.getJmeno().replace(";", " "), String.valueOf(u.getVek()), u.getRegistrovan().toString()};

A jsme hotoví. Pokud vám něco nešlo úplně hladce, hotový projekt máte jako vždy v příloze i se zdrojovým kódem. V příští lekci, Úvod do formátu XML souborů v Javě, se podíváme na formát XML.


 

Stáhnout

Staženo 17x (39.45 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

 

Článek pro vás napsal Petr Štechmüller
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje primárně programování v Jave, ale nebojí se ani webových technologií.
Předchozí článek
Uložení objektů do CSV v Javě
Všechny články v sekci
Práce se soubory v Javě
Miniatura
Následující článek
Cvičení k 1.-5. lekci práce se soubory v Javě
Aktivity (4)

 

 

Komentáře

Avatar
Pavol Franek
Člen
Avatar
Pavol Franek:5. května 19:58

Toto ti zaručene nebude fungovať:

String[] hodnoty = { u.jmeno.replace(';',' '), u.vek.toString(), u.registrovan.toString() };

V priloženom programe to máš ale dobre:

String[] hodnoty = {u.getJmeno().replace(";", " "), String.valueOf(u.getVek()), u.getRegistrovan().toString()};
 
Odpovědět 5. května 19:58
Avatar
Petr Štechmüller
Překladatel
Avatar
Odpovídá na Pavol Franek
Petr Štechmüller:5. května 20:16

Jo díky, nejspíš jsem to zapomněl v článku upravit...

Odpovědět 5. května 20:16
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 2 zpráv z 2.