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žívamejava.util.Calendar
- vieme posúvať kalendár o mesiac dopredu a dozadu
- zbavili sme sa triedy
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í
- možnosť 1: vrátiť
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
- SQL injection nehrozí, lebo parameter je typu
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()
dostanemeContentValues()
- 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é.