NOVINKA - Online rekvalifikační kurz Python programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 15 - Diář s databází v Kotlin - Dokončení

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Rábel David
Člen
Avatar
Rábel David:13.8.2019 20:54

Zdravím při vyhledání záznamu se program zacykluje, po odstranění try catch mechaniky a debugu jsem dohledal tuhle chybu** "DateTimeParse­Exception: Text could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor"**

Viz chyba se dle mého objevuje kvuli téhle části kodu a převodu času do datumu pomocí .toLocalDate()

private fun zjistiDatum(): LocalDate {
    println("Zadejte datum ve tvaru [1.1.2013]:")
    return zjistiLocalDateTime(formatDataBezCasu).toLocalDate()
}

Vyřešil jsem to tak že jsem tuhle metodu přepsal do téhle podoby

rivate fun zjistiDatum(): LocalDate {
        println("Zadejte datum ve tvaru [1.1.2013]:")
        return zjistiLocalDate(formatDataBezCasu)
    }

a poté si vytvořil pomocnou metodu na zadání inputu
viz

private fun zjistiLocalDate(formatData: DateTimeFormatter): LocalDate {
         try {
        return LocalDate.parse(readLine(), formatData)
        } catch (e: Exception) {
        println("Nesprávně zadáno, zadejte prosím znovu")
        return zjistiLocalDate (formatData)
        }
    }

Mohu vědět jestli by to šlo vyřešit nějakým efektivnějším řešením popř to v článku opravit tak aby daný kód fungoval po rozběhnutí programu
Díky

 
Odpovědět
13.8.2019 20:54
Avatar
Jiri Cerveny
Člen
Avatar
Jiri Cerveny:12.5.2020 10:52

Aplikaci jsem si naprogramoval a i jsem si zkusil stáhnout zde uvedený kód ze souboru Poznamkovac.zip, ale aplikace nefunguje tak jak je na screenshotu výše, dokonce se při běhu zacyklí.
Chtělo by to upravit kód a i text článku.

 
Odpovědět
12.5.2020 10:52
Avatar
Adam Bucher
Člen
Avatar
Adam Bucher:27.7.2021 6:55

Jak již zmínil Rábel David, nefunguje parsování na LocalDateTime s DateTimeFormatter získávájícím pouze datum. Osobně jsem to vyřešil předáním metody pro parsování.

private fun <T> obtainFromInput(resultSupplier: Supplier<T>): T {
    return try {
        resultSupplier.get()
    } catch (e: Exception) {
        println("Invalid input. Try again.")
        obtainFromInput(resultSupplier)
    }
}

private fun scanDate(): LocalDate {
    println("Enter date [$dateFormat]:")
    return obtainFromInput { LocalDate.parse(readLine(), dateFormatter) }
}

private fun scanDateTime(): LocalDateTime {
    println("Enter date and time [$dateTimeFormat]:")
    return obtainFromInput { LocalDateTime.parse(readLine(), dateTimeFormatter) }
}

Taktéž jsem přidal metodu vracející seřazený seznam záznamů z databáze, kterou využívám u metod pro vypsání záznamů a vyhledání záznamů, to aby byly záznamy z daného dne seřazené podle času od nejdřívějšího po nejpozdější.

private fun findSortedRecords(date: LocalDate): List<Record> {
    return database.findRecords(date).sortedBy(Record::dateTime)
}

Děkuji za velmi naučné lekce s diářem. :-)

 
Odpovědět
27.7.2021 6:55
Avatar
Monika Havlíčková:18.9.2022 17:22

Celá lekcia skvelá a nakoniec sa program zacyklí. Škoda. Keby nebol koment od Rábel David, tak by som nevedela, čo sa deje.

 
Odpovědět
18.9.2022 17:22
Avatar
Petr Grenar
Člen
Avatar
Petr Grenar:23.2.2023 9:57

Lekce super. Člověk tu pěkně vidí jak správně pracovat s třídami a jak plánovat při vývoji aplikace. Škoda nefunkčního kódu. Bylo by fajn opravit. Komentáře naštěstí zachráníli.

 
Odpovědět
23.2.2023 9:57
Avatar
x.listo
Tvůrce
Avatar
x.listo:27. ledna 12:20

Chyba v ukázce je způsobena v metodě zjistiLocalDa­teTime, protože pokaždé vrací LocalDateTime. Zatímco ve vyhledávání se používá LocalDate. Pattern 'd.M.yyyy' nejde použít pro převod na LocalDateTime.

Jedna možnost je již uvedena v prvním komentu. Nebo moje varianta je pracovat jen s LocalDateTime. Do metody zjistiLocalDa­teTime jsem přidal podmínku zda-li obsahuje dvojtečku, pokud není obsažena doplní se textový vstup o '0:0'

private fun zjistiLocalDateTime(formatData: DateTimeFormatter): LocalDateTime {
        var datum = readLine()!!
        if (!datum.contains(":"))
            datum += " 0:0"
        try {
            return LocalDateTime.parse(datum, formatData)
        } catch (e: Exception) {
            println("Nesprávně zadáno, zadejte prosím znovu")
            println(e)
            return zjistiLocalDateTime(formatData)
        }
    }
private fun zjistiDatum(): LocalDateTime {
        println("Zadejte datum ve tvaru [1.1.2013]:")
        return zjistiLocalDateTime(formatData)
    }
 
Odpovědět
27. ledna 12:20
Avatar
x.listo
Tvůrce
Avatar
x.listo:27. ledna 14:58

Nefunkční přiložený kód - více v komentářích pod článkem.

 
Odpovědět
27. ledna 14:58
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 7 zpráv z 7.