String je základní datový typ v programovacích jazycích. Slouží k uchování textu. Pokud chceme napsat String tak text vložíme mezi dvojité uvozovky.
val cesta = "cesta";
Ve většině případů je to dostačující. Co když do textu chceme nastavit cestu na soubor jako text.
C:\work\tools\__test
Musíme ho vložit do proměnné typu String a všechna lomítka zdvojit - escapnout.
val cesta = "C:\\work\\tools\\__test";
Kotlin má také pomůcku a tou je Raw String. Pro napsání textu použiji třikrát dvojité uvozovky na začátku i na konci.
val cestaRaw = """C:\work\tools\__test"""
Raw String nám umožňuje zapsat String na více řádků bez nutnosti spojování pomocí +.
Mám text, který chci napsat na více řádků. Co musím udělat, pokud to chci v jednom Stringu? Všechny části spojím pomocí + a přidám speciální značku pro nový řádek \n.
val text = "1 639,33\n" +
"6 540,03\n" +
"8179,36\n" +
"+2500,04"
U Raw Stringu jen stisknu enter pro nový řádek a pokračuji v psaní.
val textRaw = """1 639,33
6 540,03
8179,36
+2500,04"""
Tento způsob ale není pěkně čitelný – veškerý text mám zasazený na levou stranu, neboť nechceme abychom tam dali např. taublátor – v původním textně nebyl.
Co můžeme udělat je přidat nějaké speciální značku na začátek řádku, který chci odsadit a pak řeknu, že vše nalevo od značky spolu se značkou považuji jen za odsazení textu.
Přidejte značku (hocijakou):
val textRaw = """1 639,33
#6 540,03
#8179,36
#+2500,04"""
Nyní řekneme, že # je speciální značka pro odsazení.
val textRaw = """1 639,33
#6 540,03
#8179,36
#+2500,04""".trimMargin("#")
A můžeme odsadit pro lepší čitelnost:
val textRaw = """1 639,33
#6 540,03
#8179,36
#+2500,04""".trimMargin("#")
Nebo použijeme default znak oddělovače, což je pipe |.
val textRaw = """1 639,33
|6 540,03
|8179,36
|+2500,04""".trimMargin()
Nyní se tyto dva Stringy budou rovnat.
println("${text == textRaw}") //true
Použití v reálné aplikaci
Určitě bys rád viděl příklad z reálné aplikace. Jedním z takových příkladů by bylo použití při psaní Android aplikace. Přesněji například při psaní příkazů pro poptávku na databázi v Room frameworku, který se používá pro zjednodušený přístup k databázím.
V Room píšeme takzvané Dao třídy pro přístup k databázi. Vezměme si jeden příklad kde chci napsat SQL příkaz k vyjmutí filmů z databáze.
@Query("SELECT id, movie_name, genres, directors year FROM MOVIES")
suspend fun getAllMovies(): List<MovieShort>
Příkaz bys rád napsal na více řádků, aby byl lépe čitelný.
@Query("SELECT id, movie_name, genres, directors year " +
"FROM MOVIES")
suspend fun getAllMoviesInShortForm(): List<MovieShort>
Nebo použiješ Raw String.
@Query("""
SELECT id, movie_name, genres, directors year
FROM MOVIES
""")
Určitě si umíš představit jak se ti zlepší čitelnost, budeš-li mít složitější select příkazy v kombinaci například s join.