
Programujeme pre Android /14. časť
V tomto článku sa plnou silou vrhneme na praktickú implementáciu pridávania súborov (konkrétne obrázkov) k položkám zoznamu a následnú synchronizáciu databáz. Napriek tomu, že budeme musieť mnoho vecí zjednodušiť, pokúsime sa opísať celý proces od výberu obrázka z galérie smartfónu až po jeho uloženie na server.
Zameriame sa na pridávanie konkrétneho typu súboru, ktorým je obrázok. Nič nám však nebráni v tom, aby sme rovnaký postup zovšeobecnili a umožnili tak používateľom pridávať k položkám zoznamu akékoľvek typy súborov. V konečnom dôsledku vždy ide o HTTP prenos údajových bajtov a je jedno, či tieto bajty reprezentujú obrázok, textový dokument, prezentáciu, hudobnú skladbu či iný typ súboru.
Pridanie obrázkau k položke zoznamu a odoslanie obrázka na server v procese synchronizácie
Algoritmus pridávania obrázkov k položkám zoznamu
Pri tvorbe algoritmu vychádzame z úvah, pri ktorých obrázok, ktorý chceme priradiť k položke zoznamu, uložíme do osobitnej zložky patriacej našej aplikácii tak, aby nedošlo k strate obrázka v prípade jeho vymazania z galérie smartfónu. Ďalej uvažujeme nad uložením cesty k tomuto obrázku do tabuľky SQLite. Pri synchronizácii požadujeme, aby sa všetky obrázky priradené položkám tabuľky SQLite odoslali (upload) na server a k zodpovedajúcim položkám tabuľky MySQL sa doplnili názvy prenesených súborov. V tomto momente neriešime všetky aspekty CRUD, teda používateľ zatiaľ nemá možnosť obrázky vymazávať, resp. nahrádzať inými.
Zvolený procesný postup pridávania obrázkov k položkám zoznamu je nasledujúci:
- K pôvodnému postupu, pri ktorom sme do vstupného poľa data (EditText) zadali text = obsah položky zoznamu, sme doplnili možnosť pridania obrázka pomocou tlačidla PRIDAJ OBRÁZOK.
- Metódou startActivityForResult() je spustená nová aktivita, pomocou ktorej používateľ vyberie obrázok z galérie smartfónu.
- Po výbere obrázka dôjde v rámci metódy onActivityResult() (selektora LOAD_FROM_GALLERY) ku skopírovaniu obrázka do zložky db_files na externom úložisku smartfónu. Obsah tejto zložky programovo nadväzuje na aplikáciu db_sync_v3 pomocou getExternalFilesDir(),čo znamená, že po odinštalovaní aplikácie sa automaticky vymažú všetky obrázky nachádzajúce sa v uvedenej zložke.
- Nasleduje reakcia aplikácie na stlačenie tlačidla m_uloz_riadok. Pôvodnú funkcionalitu sme nemenili. Jediná zmena je doplnenie stĺpca attachment tabuľky údaje, do ktorého sa ukladá absolútna cesta k súboru s obrázkom. V prípade, ak nie je vybratý nijaký obrázok, do stĺpca attachment sa uloží jednoduchý text „no".
- Majoritná zmena zdrojového kódu aplikácie nastala v prípade synchronizačných metód. Okrem toho, že došlo k markantnej zmene spôsobu komunikácie aplikácie so serverom, v rámci metódy syncMySQL_to_SQLite() voláme metódu UploadImage(), ktorej úlohou je odoslať obrázok prislúchajúci konkrétnemu riadku tabuľky SQLite na server. Významnú rolu pri tom zohráva PHP skript uploadimage.php, ktorý sa nachádza na webovom serveri.
- Algoritmus synchronizácie sa končí vložením názvu odoslaného súboru do stĺpca attachment MySQL tabuľky test_table nachádzajúcej sa na serveri.
Metódy podporujúce algoritmus
Po pridaní obrázka k položke zoznamu je nevyhnutné položku správne zobraziť, čo znamená novú implementáciu metód triedy CursorAdapter. Akákoľvek komunikácia so serverom opísaná v bode 5 prebieha na pozadí (doInBackground()), keď je volaná novo pridaná metóda server_post(). Jednoznačne najvýznamnejšia novo pridaná metóda aplikácie je metóda UploadImage(), ktorá završuje proces synchronizácie databáz.
Detailnejší význam uvedených metód je nasledujúci:
Trieda
Metóda
Význam
MyAdapter
bindView()
|
Je vykonávaná pri zobrazení položiek zoznamu ListView, pričom pri zobrazovaní obrázkov dochádza k ich zmenšeniu a korektnému otočeniu v rámci metódy setImageBitmap(loadImage()).
httpPost
server_post()
|
Vytvorenie spojenia HTTP so serverom url.openConnection() a odoslanie parametrov POST zvolenému skriptu PHPVykonanie skriptu na strane servera a získanie prislúchajúcej odpovede conn.getResponseMessage().
MainActivity
UploadImage()
|
Vytvorenie spojenia so serverom, odoslanie obrázka dos.write() a získanie odpovede zo servera.
Štruktúra tried aplikácie db_sync_v3 a zobrazenie kódu PHP skriptu uploadimage.php
Webový server
Základný princíp synchronizácie údajov uložených v jednotlivých databázach je používanie sprostredkujúcich skriptov PHP, ktoré sa nachádzajú na strane servera. Z dôvodu doplnenia obrázkov k riadkom tabuľky SQLite musíme v prvom rade doplniť našu testovaciu tabuľku nachádzajúcu sa na serveri o nový stĺpec. Na strane servera ďalej vytvoríme zložku db_files, do ktorej budú umiestňované uploadované obrázky.
Do tabuľky MySQL ukladáme iba jednoduchý názov súboru s obrázkom, nie celú, resp. absolútnu cestu, pretože tá je odlišná od absolútnej cesty používanej v prípade smartfónu. Súbory odoslané na server môžeme nájsť v uvedenej zložke a je už len na nás, akým spôsobom pripravíme skripty zobrazujúce obsah tabuľky MySQL. V našom prípade používame na kontrolu funkčnosti programového kódu a obsahu tabuľky MySQL prostredie phpMyAdmin.
Na zopakovanie uvedieme, že funkčnosť aplikácie db_sync je závislá od existencie webového prostredia W/LAMP. Webový server musí byť schopný vykonávať skripty PHP a takisto musíme mať k dispozícii funkčnú databázu MySQL, v rámci ktorej vytvoríme tabuľku test_table (zodpovedajúci príkaz SQL je súčasťou súboru php/dbfunc.php). URL servera (DB_HOST), názov databázy (DB_DATABASE) a príslušné prihlasovacie údaje (DB_USER, DB_PASSWORD) nastavujeme takisto v súbore Všetky ostatné skripty nachádzajúce sa v zložke php koreňa súborovej štruktúry aplikácie musíme umiestniť do príslušnej zložky nášho webového servera a zodpovedajúce URL jednotlivých skriptov PHP musíme uviesť v súbore app/src/main/res/values/strings.xml.