SZOFTVERFEJLESZTÉS ANDROID PLATFORMRA Dr. Iszály György Barna
TÁROLÁSI LEHETŐSÉGEK Shared preferences: egyszerű kulcs-érték párral leírható adatok tárolására Internal Storage: az alkalmazásunk privát adatainak tárolására szolgáló megoldás External Storage: másokkal megosztható információk rögzítését oldhatjuk meg a segítségével SQLite adatbázis: strukturált adatok tárolása egy privát adatbázis által Hálózati kapcsolat: az adatok weben keresztüli rögzítése
KULCS-ÉRTÉK PÁROK TÁROLÁSA SharedPreferences osztály segítségével Primitív adattípusok (int, float, boolean, String, stb.) adatait tárolhatjunk szöveges típusú kulcsok segítségével Az Activityhez tartozó privát területen tárolódnak az értékek Metódusai: getsharedpreferences(): nevesített állomány létrehozására, illetve megnyitására szolgáló függvény getpreferences(): ha az Activity csupán egyetlen preferencia fájlt kíván tárolni, név megadására nincs is szükség Ha a sharedpref.getstring() metódus nem találja a fájlban a kulcsot, alapértelmezett értékkel tér vissza. Ha a preference fájl létezik, de rossz típusú metódussal próbálunk olvsani belőle, ClassCastException típusú kivételt dob.
INPUT OUTPUT MEGVALÓSÍTÁSA Írás Az Editor osztály egy objektumát kell használni az íráshoz put<típus>(string kulcs, <típus> érték) Olvasás A SharedPreferences osztály metódusaival get<típus>() Törlés egyetlen kulcs-értékpárt: remove(string kulcs) valamennyi kulcs-értékpárt törlése: clear() Jóváhagyás commit() apply() aszinkron függvénnyel
PÉLDA Adatok tárolása SharedPreferences sharedpref = getsharedpreferences( FileNeve, Context.MODE_PRIVATE); SharedPreferences.Editor editor = sharedpref.edit(); editor.putstring( Kulcs, Érték ); editor.commit(); Adatok visszaolvasása SharedPreferences sharedpref = getsharedpreferences( FileNeve,Context.MODE_PRIVATE); textview1.settext(sharedpref.getstring( Kulcs, "A preference nem található"));
INTERNAL STORAGE HASZNÁLATA Csak az alkalmazásunk számára elérhető adatok tárolására szolgál Az alkalmazás eltávolításakor a rögzített adatok is eltávolításra kerülhetnek Létrehozás Az openfileoutput() függvény hívása a létrehozandó fájl nevével és a hozzáférés módjával. Visszatérési értéke egy FileOutputStream. Írás a write() függvény segítségével. Lezárás a close() metódussal lehetséges. A létrehozandó fájl hozzáférésének módjai: MODE_PRIVATE: mindenki elől rejtett MODE_WORLD_READABLE: publikus olvasási lehetőség MODE_WORLD_WRITABLE: publikus írási opció MODE_APPEND: meglévő állomány bővítése hozzáfűzéssel
INTERNAL STORAGE HASZNÁLATA Olvasás: openfileinput() hívása, a visszaadott eredmény FileInputStream. Olvasás a read() metódussal. A stream lezárása a close() hívásával. Ha a file nem létezik, nyitáskor FileNotFoundExceptiont kapunk. További metódusok: getfilesdir(): visszaadja az adatokat tartalmazó könyvtár elérési útját egy File objektumba. getdir(): létrehozza, vagy megnyitja a már létező könyvtárat a könyvtárunkon belül. deletefile(): törli a kijelölt fájlt a tárolóból.
TELEPÍTÉSKOR MÁR ELÉRHETŐ ADATFÁJLOK LÉTREHOZÁSA Telepítéskor már rendelkezésre álló adathalmazt szeretnénk készíteni, akkor ezeket a fejlesztés ideje alatt kell létrehozni: A fájl(ok) mentése történjen a res/raw könyvtárba. A megnyitás az openrawresource() segítségével lehetséges, a megfelelő erőforrása azonosítójának megadásával. Ennek képzése: R.raw.<fájl neve> A fenti metódus InputStreammel tér vissza, ami képes olvasni a fájlt. Az eredeti állomány nem írható.
PÉLDA SZÖVEGES ÁLLOMÁNY LÉTREHOZÁSA String file_neve = "hello_vilag"; String szoveg = "Helló Világ!"; FileOutputStream fki; try{ } finally { } fki = openfileoutput(file_neve, Context.MODE_PRIVATE); fki.write(string.getbytes()); fki.close();
EXTERNAL STORAGE HASZNÁLATA External Storage külső adattárolóknak a használata, amelyekre adatokat menthetünk Beépített, fix eszköz is lehet FAT fájlrendszerek használja Több partíció is kialakítható rajtuk, támogatottak az ext típusú fájlrendszerek is Az adatok bárki számára elérhetőek, módosíthatóak, ha a felhasználó az USB mass storage funkcióját aktiválja Az eszköz akár fizikailag is eltávolítható - az itt található adatok az alkalmazásunk számára ideiglenesen, vagy tartósan is elérhetetlenné válhatnak. Fontos vizsgálni!!!
EXTERNAL STORAGE HASZNÁLATA getexternalstoragestate() az External Storage állapotának lekérdezése Az állapot String típusú konstans: MEDIA_MOUNTED: a lemezterület felcsatolt MEDIA_MOUNTED_READ_ONLY: csak olvasható módon hozzáférhető a tároló. MEDIA_BAD_REMOVAL: szabálytalanul lett a tároló eltávolítva (lecsatolás nélkül) MEDIA_CHECKING: a tárolót érzékeltük, lemezellenőrzés zajlik MEDIA_NOFS: a tároló üres, vagy nem támogatott fájlrendszert tartalmaz. MEDIA_REMOVED: a tároló le van csatolva (eltávolított). MEDIA_SHARED: a tároló USB mass storage alatt megosztott. MEDIA_UNMOUNTABLE: a tároló érzékelve, de nem felcsatolható. MEDIA_UNMOUNTED: a tároló érzékelve, de nincs felcsatolva.
EXTERNAL STORAGE HASZNÁLATA Tároló menet közbeni eltávolítása Intent Filterrel kell figyelni (Intent.ACTION_MEDIA_REMOVED) Eltávolításkor értesítést kaphatunk egy saját broadcast receiver segítségével. Android 2.2 (API Level 8) vagy újabb Android esetén bizonyos fájltípusokat szervezetten, egy-egy dedikált mappában tárolhatunk getexternalfilesdir() - paraméteréül megadott String típus segítségével visszaad egy javasolt teljes elérési útvonalat az adott fájltípus számára Pár fájltípusokhoz tartozó String: DIRECTORY_PICTURES: képek tárolására szolgáló mappa DIRECTORY_MUSIC: zenék tárolásához. DIRECTORY_RINGTONES: csengőhangok számára kijelölt könyvtár. Ha a típus hiányzik, a tároló gyökérkönyvtárát adja vissza.
EXTERNAL STORAGE HASZNÁLATA A 2.2-nél korábbi Android esetében getexternalstoragedirectory() ezzel elérhetjük a gyökérkönyvárat. A javasolt könyvtárszerkezet a tároláshoz: /Android/data/<alkalmazás csomagneve>/files/ Az újabb Androidok az alkalmazás eltávolításakor ezeket a mappákat törlik! Jelenleg valamennyi alkalmazás olvashatja a külső tárolókat külön engedély nélkül is. A külső tároló olvasásához jogosultság szükséges <uses-permission android:name="android.permission.read_external_storage" /> A meglévő írási jog egyúttal olvasási jogot is jelent.
PÉLDA AZ EXTERNAL STORAGE HASZNÁLATÁRA Jogosultságot először meg kell adni <uses-permission android:name="android.permission.write_external_storage" /> if(environment.media_mounted.equals(environment.getexternalstorage State())){ File root =android.os.environment.getexternalstoragedirectory(); File dir = new File (root.getabsolutepath()+"/sajat_konyvtar"); dir.mkdirs(); File file = new File(dir, "hello.txt"); FileOutputStream f; PrintWriter pw; Állomány létrehozása Saját könyvtár létrehozása A külső tároló elérhetőségéne k vizsgálata. Gyökérkönyvtár meghatározása
PÉLDA AZ EXTERNAL STORAGE HASZNÁLATÁRA } try { f = new FileOutputStream(file); pw = new PrintWriter(f); pw.println("helló Világ!"); pw.flush(); } catch (FileNotFoundException e) { e.printstacktrace(); Írás az állományba Log.e(getString(R.string.app_name), "A fájl nem található. Írási jogosultság?"); } finally { pw.close(); f.close(); }