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

Post on 27-Jan-2015

1.123 views 0 download

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)

1 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

AndroidStocarea Datelor

Vlad PETRE

vlad@vladpetre.com

http://twitter.com/vladpetre88

http://facebook.com/vladpetre88

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

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

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 = “”;

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

5 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Preferinte (Setari)

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.

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();

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.

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);

10 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

PreferenceActivity

Context.MODE_PRIVATE

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

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

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.

14 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

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

15 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Fisierul XML

Salvat in res/xml/settings.xml

16 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Siruri cu valori

Salvat in res/values/arrays.xml

17 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

PreferenceActivity

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"));

19 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Stocarea interna

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.

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.

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.

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).

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.

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.

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.

27 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Stocare externa

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.

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

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;}

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/

32 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Date private

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)!

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– …

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.

36 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Date partajate

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.

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/

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– …

40 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Cache extern

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)!

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).

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

44 Scoala de Vara IP Workshop 2011 – Calimanesti Valcea

Întrebări?