[Curs Android] C09 - Stocarea Datelor (IPW 2011)

44
1 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea Android Stocarea Datelor Vlad PETRE vlad@vladpetre.com http://twitter.com/vladpetre88 http://facebook.com/vladpetre88 http://www.linkedin.com/in/ vladpetre88

description

These slides are part of the Android Development Course which I taught to 10 students, while participating in the IP Workshop Summer School 2011. http://www.scoaladevara.info/2011/?page_id=39

Transcript of [Curs Android] C09 - Stocarea Datelor (IPW 2011)

Page 1: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

1 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

AndroidStocarea Datelor

Vlad PETRE

[email protected]

http://twitter.com/vladpetre88

http://facebook.com/vladpetre88

http://www.linkedin.com/in/vladpetre88

Page 2: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

2 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Date Predefinite• ReadOnly• Assets

– directorul assets– reprezinta un depozit nestructurat de fisiere

• Resurse– directorul res/raw– devin R.raw.nume_resursa

Page 3: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

3 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Assets• Ca sa deschidem un asset:

AssetManager am = context.getResources().getAssets();InputStream is = am.open (String assetName);

• Ca sa obtin lista de asseturi:String[] assetsList = am.list (String path);

• path – este relativ la directorul assets• Ex: pentru a cauta direct in directorul assets, atunci path = “”;

Page 4: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

4 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Resurse• InputStream is = context.getResources().open(int id);

• id este un int de forma– R.raw.nume_resursa

Page 5: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

5 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Preferinte (Setari)

Page 6: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

6 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Preferinte (Setari)• Mecanism prin care putem retine anumite date de

configurare (ex: numele utilizatorului, ringtone-ul, etc).• Putem stoca cinci tipuri de date:

– String– float– boolean– int– long

• Datele persista atata timp cat aplicatia e instalata in telefon.

Page 7: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

7 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Scrierea unor preferinte (1)String KEY = “myPrefs”;int mode = Context.MODE_PRIVATE;

SharedPreferences myPrefs = context.getSharedPreferences(KEY, mode);

SharedPreferences.Editor prefsEditor = myPrefs.edit();

prefsEditor.putString(“name”, “Alex Marcu");prefsEditor.putInt(“age”, 23);

prefsEditor.commit();

Page 8: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

8 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Scrierea unor preferinte (2)• Moduri:

– Context. MODE_PRIVATE• Default. Fisierul poate fi accesat doar de catre aplicatia care l-a

creat.

– Context.MODE_APPEND• Scrierea are loc la sfarsitul fisierului. Fisierul poate fi accesat

doar de catre aplicatia care l-a creat.

– Context.MODE_WORLD_READABLE• Permitem tuturor aplicatiilor sa citeasca fisierul respectiv.

– Context.MODE_WORLD_WRITEABLE• Permitem tuturor aplicatiilor sa scrie fisierul respectiv.

Page 9: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

9 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Citirea unor preferinteString key = “myPrefs“;int mode = Context.MODE_PRIVATE;

SharedPreferences myPrefs = context.getSharedPreferences (key, mode);

String name = myPrefs.getString(“name”, "nothing");int age = myPrefs.getInt(“age”, -1);

Page 10: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

10 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

PreferenceActivity

Context.MODE_PRIVATE

Page 11: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

11 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

PreferenceActivity• Activitate specializata pentru setari.• Din punct de vedere vizual, este construita automat.• Preferintele trebuiesc definite intr-un fisier *.xml

plasat in directorul res/xml.• addPreferencesFromResource(R.xml.xml_setari);• Tipuri de preferinte:

– String– boolean

Page 12: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

12 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Fisierul xml (1)• Contine elemente de tipul Preference

– ListPreference, CheckBoxPreference, EditTextPreference, etc

• Atribute posibile:– key – cheie unica de identificare– title – un titlu informativ pentru user– summary – un sumar informativ pentru user– defaultValue – valoarea initiala– dependency – determina disponibilitatea setarii in functie

de o alta

Page 13: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

13 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Fisierul xml (2)• Tipuri de setari:

– ListPreference– CheckBoxPreference– EditTextPreference– RingtonePreference

• Grupate in diferite categorii– PreferenceCategory

• key• title

Nodul radacina din cadrul fisierului xml se numeste PreferenceScreen.

Page 14: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

14 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Exemplu cu PreferenceActivity• Definim un fisierul XML• Scriem PreferenceActivity• Definim PreferenceActivity in Manifest

Page 15: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

15 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Fisierul XML

Salvat in res/xml/settings.xml

Page 16: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

16 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Siruri cu valori

Salvat in res/values/arrays.xml

Page 17: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

17 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

PreferenceActivity

Page 18: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

18 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Citirea setarilorSharedPreferences preferences =

PreferenceManager.getDefaultSharedPreferences(this);

String name = preferences.getString("name", "(no name)");boolean isStudent = preferences.getBoolean("student", false);int year = Integer.parseInt(preferences.getString("year", "1"));

Page 19: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

19 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Stocarea interna

Page 20: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

20 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Stocare Interna• Sub forma de fisiere aflate intr-un director special in

cadrul aplicatiei.• In general, stocarea de fisiere are loc in memoria

interna nevolatila, nu pe cardul SD.

Page 21: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

21 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Scrierea unui fisier internString FILENAME = "hello_file";String string = "hello world!";

FileOutputStream fos = context.openFileOutput(FILENAME, Context.MODE_PRIVATE);

fos.write(string.getBytes());fos.close();

• FILENAME nu are voie sa contina o cale, ci se precizeaza direct numele fisierului.

Page 22: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

22 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Citirea unui fisier intern

String FILENAME = "hello_file";FileInputStream fis = context.openFileInput(FILENAME);

• FileInputStream se foloseste exact ca in Java SE.• FILENAME nu are voie sa contina o cale, ci se

precizeaza direct numele fisierului.

Page 23: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

23 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Listarea fisierelor interne

String[] fileList = context.fileList();

• Intoarce o lista cu numele fisierelor interne (fara cale).

Page 24: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

24 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Stergerea fisierelor interne

String FILENAME = "hello_file";boolean successfullyDeleted =

context.deleteFile(FILENAME)

• FILENAME nu are voie sa contina o cale, ci se precizeaza direct numele fisierului.

Page 25: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

25 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Directoare interne

File dir = context.getDir(String dirName, int mode);

• Metoda imi intoarce directorul respectiv. Daca acesta nu exista, il creaza.

• Se foloseste exact ca in Java SE.

Page 26: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

26 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Cache Intern

File cacheDir = context.getCacheDir();

• Un director special.• Se sterge automat atunci cand sistemul decide ca

are prea putina memorie interna.

Page 27: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

27 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Stocare externa

Page 28: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

28 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Stocare externa• Are loc pe cardul SD, unde pot scrie toate aplicatiile

oriunde.• Trebuie sa avem grija, deoarece cardul SD nu este

permanent prezent (avem mai multe stari).

• Odata cu API 8 au fost introduse cateva directoare speciale pe cardul SD.

Page 29: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

29 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Starile cardului SD• String Environment.getExternalStorageState();

– MEDIA_MOUNTED– MEDIA_MOUNTED_READ_ONLY– MEDIA_CHECKING– MEDIA_REMOVED– MEDIA_SHARED– MEDIA_UNMOUNTABLE– MEDIA_UNMOUNTED– MEDIA_BAD_REMOVAL– MEDIA_NOFS

Page 30: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

30 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Exemplu verificare stare card SDboolean mExternalStorageAvailable = false;boolean mExternalStorageWriteable = false;String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) { // We can read and write the media mExternalStorageAvailable = mExternalStorageWriteable = true;} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { // We can only read the media mExternalStorageAvailable = true; mExternalStorageWriteable = false;} else { // Something else is wrong. It may be one of many other states, but all we need // to know is we can neither read nor write mExternalStorageAvailable = mExternalStorageWriteable = false;}

Page 31: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

31 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Cum stocam datele pe cardul SD

API <= 7 API >= 8Date private Date privateDate partajate Date partajateCache extern Cache extern

• In general, calea catre cardul SD este de forma:o /sdcard/

Page 32: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

32 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Date private

Page 33: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

33 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Date private conform API <= 7• Preluam calea catre cardul SD:

– File externalDir = Environment.getExternalStorageDirectory();

• Iar apoi scriem fisierele in directorul de pe card:– /Android/data/<package_name>/files/

• Ceea ce stocam conform acestei metode este sters la dezinstalare, doar daca aplicatia a fost instalata pe Android 2.2 (API >= 8)!

Page 34: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

34 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Date private conform API >= 8 (1)• Calea catre cardul SD o preluam:

– File externalDir = Environment.getExternalFilesDir (String type);

• Cu parametrul type putem preciza un subdirector:– DIRECTORY_MUSIC– DIRECTORY_PODCASTS– DIRECTORY_RINGTONES– DIRECTORY_ALARMS– …

Page 35: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

35 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Date private conform API >= 8 (2)• Daca type este null, atunci primesc directorul

radacina al locatiei unde este recomandat ca eu sa salvez fisiere pe cardul SD.

• Ceea ce stocam conform acestei metode este sters la dezinstalare.

• Subdirectoarele ajuta Scannerul Media al Android-ului. Spre exemplu, sunetele stocate in DIRECTORY_RINGTONES nu vor aparea in player-ul de muzica.

Page 36: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

36 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Date partajate

Page 37: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

37 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Date partajate conform API <= 7 (1)

File externalDir = Environment. getExternalStorageDirectory ();

• Intoarce directorul radacina al cardului SD.

Page 38: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

38 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Date partajate conform API <= 7 (2)• Se recomanda sa salvam fisierele corespunzator

urmatoarelor subdirectoare:– Music/– Podcasts/– Ringtones/– Alarms/– Notifications/– Pictures/– Movies/– Download/

Page 39: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

39 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Date partajate conform API >= 8File externalDir = Environment.getExternalStoragePublicDirectory

(String type);• Intoarce directorul radacina extern unde atat noi, cat si alte

aplicatii, putem stoca fisiere.• Cu parametrul type putem preciza un subdirector:– DIRECTORY_MUSIC– DIRECTORY_PODCASTS– DIRECTORY_RINGTONES– DIRECTORY_ALARMS– …

Page 40: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

40 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Cache extern

Page 41: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

41 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Cache extern conform API <= 7

File externalDir = Environment. getExternalStorageDirectory ();

• Intoarce directorul radacina al cardului SD.• Iar apoi scriem fisierele in directorul de pe card:

– /Android/data/<package_name>/cache/• Sistemul NU va sterge aceste fisiere daca ramane fara spatiu pe cardul

SD (deci le gestionam singuri).• Ceea ce stocam conform acestei metode este sters la dezinstalare, doar

daca aplicatia a fost instalata pe Android 2.2 (API >= 8)!

Page 42: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

42 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Cache extern conform API >= 8

File externalCacheDir = Environment.getExternalCacheDir();

• Fisierele sunt sterse automat daca userul dezinstaleaza aplicatia.

• Sistemul NU va sterge aceste fisiere daca ramane fara spatiu pe cardul SD (deci le gestionam singuri).

Page 43: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

43 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Referinte• http://pdm.ipworkshop.ro• http://developer.android.com/reference/android/co

ntent/res/AssetManager.html• http://www.kaloer.com/android-preferences• http://developer.android.com/guide/topics/data/da

ta-storage.html

Page 44: [Curs Android] C09 - Stocarea Datelor (IPW 2011)

44 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Întrebări?