180 minút s Androidom: 7. stretnutie [Kalendárik s farebnými dňami nad databázou]

Plán

  • migrácia content providera na databázu
  • integrácia s hlavnou aktivitou

Priebeh

  • riadime sa dokumentáciou z minulého stretnutia.

Demo aplikácia

  • stiahnite si zdrojáky z GitHubu
  • oproti výsledku na cvičení:
    • zbavili sme sa triedy DayMonthYear, namiesto nej používame java.util.Calendar
    • vieme posúvať kalendár o mesiac dopredu a dozadu

Poznámky

Farba pre neznáme dni

  • je dobré dohodnúť sa, čo vráti metóda query() v content provideri, ak sa nenájde farba pre daný deň
    • možnosť 1: vrátiť MatrixCursor s konštantnou priehľadnou farbou (Color.TRANSPARENT). Táto možnosť je korektná vzhľadom na návratovú hodnotu `getType() a variant “vraciame jediný riadok”.
    • možnosť 2: vrátiť null a spoľahnúť sa na UI, ktoré to ošetrí

Content provider beží v separátnom vlákne.

  • nesmieme v ňom získavať getWritableDatabase()
  • môžeme však vytvoriť open helper, poznačiť ho do inštančnej premennej, a databázu získavať getterom.
  • volanie tejto metódy sa cachuje, čiže databáza je pseudosingleton
  • v content provideri nemusíme zatvárať databázu, prostriedky sa uvoľnia automaticky
    • vo finalizéri sa zatvorí

Bezpečnosť pri databázových operáciách

SQL Injection pri číslach

Ak hľadáme podmienku typu WHERE timestamp = 123456, môžeme:

  • vybudovať podmienku lepením reťazcov

    "timestamp=" + timestamp
    
    • SQL injection nehrozí, lebo parameter je typu long
  • vybudovať použitím parametrov

    • dopyt je možné nakešovať
    • aj keď máme zložitejší zápis

      Database.DayColor.TIMESTAMP + "=?"
      

ContentValues z metódy insert()

  • v metóde insert() dostaneme ContentValues()
  • je bezpečnejšie vytvoriť vlastnú inštanciu a nakopírovať do nej len tie stĺpce, ktoré naozaj chceme vkladať
  • inak hrozí útok, keď používateľ insertne dáta, ktoré majú ostať nezmenené.

Nástroj pre pozeranie databázy

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *