Taula de continguts

Persistència en dispositius Android

La persistència en Android és un tema sensible degut al model de seguretat que asseguri la privacitat de les dades de les aplicacions.

Referències:

, , , ,

Persistència

Segons Android Data Storage tenim diversos tipus d'emmagatzematge:

  1. Preferències compartides: tipus simples en forma clau-valor.
  2. Emmagatzematge Intern: es guarda arxiu en la memòria interna del dispositiu, no es pot compartir entre aplicacions per seguretat.
    • Els arxius es guarden a /data/data/com.myorg.myapp/files.
  3. Emmagatzematge «Extern» o Compartit: SD card o memòria interna compartida entre aplicacions com la carpeta DCIM on hi ha el carret de fotos.
    • Els arxius es guarden a /data/media/0/Android/data/com.myorg.myapp/files.
  4. BBDD SQLite
  5. Connexió de xarxa (guardar en un servidor d'internet)


Emmagatzematge intern

És el més segur ja que no es pot compartir entre aplicacions. La seguretat es manté sempre i quan no es faci root el dispositiu.

L'objecte Context (del qual deriva Activity) ens proveeix algunes funcions per tractar els fitxers:

Exercici

Mini agenda

App de testeig per visualitzar els arxius i les carpetes d'emmagatzematge intern.

Ampliació (només si dona temps):


Emmagatzematge compartit

Si utilitzem aquest espai, guardarem l'arxiu en una carpeta compartida on les diferents aplicacions poden intercanviar informació, com en el carret de fotos (DCIM) o la carpeta de descàrregues (Downloads).

Dins de l'emmagatzematge compartit hi ha 2 zones:

En cas d'utilitzar emmagatzematge compartit caldrà declarar al manifest.xml els permisos pertinents:

<manifest ...>
    <uses-permission android:maxSdkVersion="18" android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:maxSdkVersion="18" android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    ...
</manifest>

Des de la API 18 en endavant (Android 4.4 KitKat) ja no cal demanar els permisos per escriure en l'àrea externa de la pròpia app, per això apareix aquest maxSdkVersion=18 en els permisos. Només cal tenir en compte que les altres aplicacions també podran accedir a aquestes dades si ho requereixen.

Si volem accedir a les imatges i arxius d'altres apps mitjançant MediaStore caldrà que traiem el maxSdkVersion i demanem els permisos READ_EXTERNAL_STORAGE i WRITE_EXTERNAL_STORAGE.

Als objectes Context i Environment trobem funcions adequades per a accedir als arxius externs de l'app:

Aquí teniu una taula resum dels espais d'emmagatzematge.

A totes dues funcions cal especificar-les a quina de les diferents carpetes volem emmagatzemar-ho. Els valors s'indiquen a l'objecte Environment i alguns exemples son: Environment.DIRECTORY_DCIM, Environment.DIRECTORY_MUSIC, Environment.DIRECTORY_SCREENSHOTS, etc.


Treballant amb XML i altres

És pràctic utilitzar arxius XML per separar els camps de forma llegible. Hi ha diverses llibreries per llegir XML amb Java:

  1. XmlSerializer és una opció.
  2. Aquest article en castellà explica força bé com utilitzar DOM parser.
  3. Potser et pot aclarir tb aquest post de DOM parser


Exercicis

Continuació de l'aplicacio «Andrevina» (endevinar el número del 1 al 100) iniciada a l'article Android.

Continuant amb l'aplicació «Andrevina» i la taula de rècords:

  1. Després d'entrar el nom per enregistrar un rècord, a més, engegarem la càmera.
  2. Capturem la imatge i la enregistrem a disc amb un nom aleatori o seqüencial.
  3. Assignem la imatge al nou item de rècord.
  4. Modifiquem el layout del ArrayAdapter per afegir-hi una ImageView al rècord (on havíem de tenir prèviament el nom i els intents).
  5. Modifiquem adequadament el adapter per aconseguir que ens agafi la imatge de disc i la assigni a la ListView


En el cas que no estiguis desenvolupant l'app «Andrevina» pots fer aquest altre exercici: