Cvičenie 9 - Zoznamy a trvalé úložiska dát

Cieľom deviateho cvičenia je precvičiť si prácu s trvalými úložiskami dát a vytváranie jednoduchých zoznamov typu RecyclerView.

Perzistencia dát

SharedPreferences

Shared Preferences je najjednoduchší spôsob ukladania dát (kľúč-hodnota), ktorý slúži na ukladanie relatívne malého množstva dát. Kľúče sú tvorené reťazcami ( String ) a hodnoty primitívnymi dátovými typmi. (Int, Float, Double, Boolean..)
Zápis môže vyzerať napríklad takto:

A čítanie napríklad takto:

SQLite

SQLite je open source relačná databáza, ako MySQL alebo Postgresql. Ukladá dáta v lokálnom súborovom systéme mobilného zariadenia. Na rozdiel od iných databáz, SQLite ukladá dáta v jednoduchých súboroch, do ktorých je možné zapisovať a čítať pomocou SQLite knižnice. Táto knižnica spolu s ďalšími pomocnými triedami je súčasťou štandardnej knižnice Androidu.

Room Db

Room Db je databázová, objektovo mapovacia knižnica, ktorá poskytuje abstraktnú vrstvu nad SQLite databázou. K tejto databáze umožňuje prístup s plnou podporou, poskytujúc pohodlné API na dotazovanie.

Je tvorená tromi hlavnými komponentmi:

1. V prvom kroku pridáme do gradle súboru aplikácie závislosti pre android.arch.persistence.room
def room_version = "1.1.1"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version"
def room_version = "2.4.3"
implementation "androidx.room:room-runtime:$room_version"
annotationProcessor "androidx.room:room-compiler:$room_version"
2. Následne vytvoríme triedu Movie s prázdnym konštruktorom (RoomDb ho vyžaduje) a pridáme anotáciu (@Entity):

2.1 Vytvoríme a anotujeme premenné reprezentujúce stĺpce v tabuľke:

  • @PrimaryKey(autogenerate=true) - Primárny kľúč
  • @ColumnInfo(name="") - Stĺpec v tabuľke

2.2 Pridáme getter a setter pre vytvorené premenné:

2.3 Pridáme parametrický konštruktor:

3. V ďalšom kroku vytvoríme data access object interface MovieDao a pridáme metódy, kt. chceme využívať pre prístup k dbs.
  • @Dao - anotácia interfacu pre definíciu DAO objektu
  • @Query("<QUERY_STATEMENT>") - anotácia metódy kt. zabezpečuje SELECT - getAll(), getById()
  • @Insert - anotácia pre vkladanie dát - insertMovies()
  • @Delete - anotácia pre mazanie dát - deleteMovie()
4. Následne vytvoríme abstraktnú triedu MovieDatabase, ktorá bude potomok triedy RoomDatabase
  • @Database(entities={<comma_separated_list_of_entity_classes.class>}, version=) - popisuje objekty a verziu dbs
5. V ďalšom kroku pridáme staticku triedu DbTools, ktorá nam poskytne singleton inštanciu dbs:
6. V MainActivity.java vytvoríme členskú triedu DbGetData, kt. rozširuje AsyncTask<Movie, Integer, List<Movie>>
  • V doInBackground() získame context dbs a prostredníctvom metódy ...movieDao().getAll() získame dáta.
    • V prípade ak je dbs prázdna, naplníme ju prostredníctvom ...movieDao().insertMovies(movies);
  • V onPostExecute() máme prístup k dátam. V našom príklade sme tieto dáta spracovali a vypísali prostredníctvom <TextView>
7. Upravíme metódu onCreate a naplníme databázu:

Zoznamy

Pre zobrazenie dynamického obsahu vo forme zoznamov poznáme v Androide viacero spôsobov, ako je napríklad:

  • ListView - vhodný pre statický obsah malého rozsahu (Settings, atď..). Ak máme v zozname 100 prvkov, aplikácia ich vykreslí všetky naraz.
  • RecyclerView - vhodný pre väčšie zoznamy, alokuje pamäť len pre prvky, ktoré sú aktuálne zobrazené.
  • <RecyclerView>

    V nasledujúcich krokoch si ukážeme implementáciu zoznamu RecyclerView, ktorá môže vyzerať napríklad takto:

    V prvom kroku si vytvoríme layout a pridáme <RecyclerView>

    Následne vytvoríme layout movie_item.xml s <TextView>

    Vytvoríme triedu MovieModel s korešpondujúcim dátovým modelom

    Vytvoríme pomocnú triedu Tools, ktorá nam zabezpečí testovacie dáta:

    Pridáme triedu MovieHolder s jednotlivými TextViews a priradíme ich v konštruktore:

    Vytvoríme triedu MovieAdapter

    Upravíme triedu MainActivity

    Zadanie 2 (odovzdávanie v MSTeams) 25b

  • Pokračujte vo vývoji zadania č. 1.
  • Vytvorte a implementujte vlastnú databázu (roomDb) 10b.
  • Prepojte RecyclerView s vlastnou databázou 10b
  • Implementujte onCLick funkcionalitu pre jednotlivé prvky v zozname 5b
    • Po kliknutí na daný prvok, zobrazte novú aktivitu (zoznam) s prislušnými hodnotami záznamu v databáze