44
Programación Android Rafael Morón Abad [email protected]

Libro Android Español

Embed Size (px)

Citation preview

Page 1: Libro Android Español

Programación  Android  

Rafael  Morón  Abad  [email protected]  

Page 2: Libro Android Español

3.5.  Persistencia  

Page 3: Libro Android Español

Persistencia  Para  poder  almacenar  información  persistente,  Android  nos  proporciona  3  mecanismos:    1.  Preferencias  2.  Ficheros  3.  BBDD  SQLite   DATOS

Page 4: Libro Android Español

Preferencias  Son  almacenes  Clave-­‐Valor.  Podemos  crear  varios  almacenes  de  preferencias.  Pero  normalmente  bastará  con  usar  un  almacén  por  defecto  para  cada  aplicación.  Cada  almacén  de  preferencias  sólo  se  instanciará  una  vez,  es  comparNdo  

Page 5: Libro Android Español

Preferencias  (II)  android.content.SharedPreferences""Interfaz  para  leer  las  preferencias  

android.content.SharedPreferences.Editor""Interfaz  para  editar  las  preferencias  

PreferenceManager.edit();!!Nos  devuelve  el  editor  de  preferencias  

 

 

Page 6: Libro Android Español

Preferencias  (II)  PreferenceManager.getDefaultSharedPreferences!(getBaseContext());!  Nos  devuelve  el  set  de  preferencias  por  defecto  

 Context. getSharedPreferences(String name, int mode)""Nos  devuelve  el  set  de  preferencias  indicado      name  –  Nombre  del  set  de  preferencias      mode  –  Permisos  de  acceso  al  set  de  preferencias        

MODE_PRIVATE        Sólo  accesible  con  mismo  UserID  MODE_WORLD_READABLE  Sólo  lectura  para  otros  UserID  MODE_WORLD_WRITEABLE  Lectura-­‐Escritura  para  todos  MODE_MULTI_PROCESS    Varios  procesos  a  la  vez  (flag)  

     

Page 7: Libro Android Español

Preferencias  (III)  Editor.putBoolean(String key, boolean value)""Almacena  un  valor  booleano.  

Editor.putFloat(String key, float value)""Almacena  un  valor  decimal  en  punto  flotante.  

Editor.putInt(String key, int value)""Almacena  un  valor  entero.  

Editor.putLong(String key, long value)""Almacena  un  valor  entero  grande.  

   

 

Page 8: Libro Android Español

Preferencias  (IV)  Editor.putString(String key, String value)""Almacena  una  cadena  de  caracteres.  

Editor.putStringSet(String key, Set<String> values)"Almacena  un  conjunto  de  cadenas.  

Editor.remove(String key)""Elimina  el  par  clave-­‐valor  con  clave  key.  

   

 

Page 9: Libro Android Español

Preferencias  (V)  Editor.apply()""Escribir  los  cambios  al  SharedPreferences.  Esta  

llamada  almacena  los  cambios  de  forma  asíncrona.  Editor.commit()""Escribir  los  cambios  al  SharedPreferences.  Esta  

llamada  almacena  los  cambios  de  forma  síncrona.    

 

Page 10: Libro Android Español

Ejemplo  PrácNco:  Preferencias  

Page 11: Libro Android Español

Preferencias  

Realizar   una   aplicación  para   Android   2.2   que  esc r iba   datos   en   un  SharedPreferences   y   los  muestre  en  un  TextView  

Page 12: Libro Android Español

Ficheros  El  almacenamiento  en  ficheros  puede  uNlizar  dos  Npos  de  almacenamiento:  •  Memoria  interna  

Por  defecto,  los  ficheros  son  privados  para  la  aplicación.  Se  eliminan  al  desinstalar  la  aplicación.  

•  Memoria  externa  (tarjeta  de  memoria)  Los  ficheros  son  públicos  y  pueden  alterarse  externamente,  p.e.  en  un  ordenador.  

Page 13: Libro Android Español

Ficheros  (II)  Almacenamiento  Interno  

Almacenamiento  Externo  (Tarjeta  SD)  

Aplicación  

AcNvos  y  Recursos  

Las  aplicaciones  normalmente  se  instalan  en  la  memoria  interna  del  teléfono.  Además  de  acceder  a  los  acNvos  y  recursos  de  la  aplicación,  podemos  escribir  ficheros  en  el  almacenamiento  interno  o  externo.  La  memoria  interna  es  escasa,  no  se  debe  abusar.  

Page 14: Libro Android Español

Ficheros  (III)  Almacenamiento  Interno  

Almacenamiento  Externo  (Tarjeta  SD)  

Aplicación  

AcNvos  y  Recursos  

Las  aplicaciones  también  pueden  estar  instaladas  en  la  tarjeta  SD  del  teléfono.  Esto  es  posible  sólo  a  parNr  de  Android  2.2.  Los  accesos  a  memoria  externa  siempre  han  sido  más  lentos,  pero  úlNmamente  apenas  son  apreciables.  

Page 15: Libro Android Español

Almacenamiento  Interno  (I)  Escribir  a  un  fichero:    final String NOMBREFICHERO= "nota";"final String contenido = "Llamar a Raquel";""FileOutputStream fos = openFileOutput( NOMBREFICHERO, Context.MODE_PRIVATE);"fos.write(string.getBytes());"fos.close();"

MODE_PRIVATE      Nuevo  fichero,  sólo  accesible  a  la  aplicación  MODE_WORLD_READABLE  Nuevo  fichero,  legible  por  otras  MODE_WORLD_WRITABLE  Nuevo  fichero,  escribible  por  otras  MODE_APPEND      Añadir  al  fichero    

Page 16: Libro Android Español

Almacenamiento  Interno  (II)  Leer  de  un  fichero:    final String NOMBREFICHERO= "nota";"StringBuffer contenido = new StringBuffer("");""FileInputStream fis = openFileInput( NOMBREFICHERO);"while( (ch = fin.read()) != -1)"        contenido.append((char)ch);"fis.close();"""

Page 17: Libro Android Español

Ejemplo  PrácNco:  Lista  de  la  compra  

Page 18: Libro Android Español

Lista  de  la  compra  

Realizar   una   aplicación  para   Android   2.2   que  e s c r i ba   t ex to   en   un  EditText.  Este   texto   se   almacenará  a l   p u l s a r   e l   b o t ó n  “Guarda”   o   al   salir   de   la  aplicación   pulsando   el  botón  “Atrás”.  

Page 19: Libro Android Español

Ejemplo  PrácNco:  Lista  de  la  compra  con  Interfaz  de  Usuario  

Page 20: Libro Android Español

Lista  de  la  Compra  con    Interfaz  de  Usuario  

Realizar  una  aplicación  para  Android   2.2   con   una   vista  Npo  Lista.  La  vista  tendrá  un  campo  de  texto   y   un   botón   “Añadir”  para   guardar   la   entrada   en  la  lista  de  la  compra.  A l   hacer   c l i ck   en   un  elemento   de   la   lista,   un  d i á l o go   no s   o f r e ce r á  eliminarlo  

Page 21: Libro Android Español

Almacenamiento  Externo  (I)  En  el  caso  de  almacenamiento  externo,  no  podemos  suponer  que  éste  existe.  Puede  no  haber  tarjeta  de  memoria  insertada.  Environment.getExternalStorageState():    Environment.MEDIA_MOUNTED      Disponible  para  leer  y  escribir    Environment.MEDIA_MOUNTED_READ_ONLY      Disponible  en  sólo  lectura    Otro  valor      No  disponible  

Page 22: Libro Android Español

Almacenamiento  Externo  (II)  En  almacenamiento  externo,  manejaremos  directorios.  

Ficheros  privados  para  la  aplicación    Context.getExternalFilesDir  (String  type)    Devuelve  un  File  que  representa  el  directorio.  

Type  es  una  de  estas  constantes  (Environment.),  o  null  para  el  directorio  raíz:        

DIRECTORY_MUSIC,  DIRECTORY_PODCASTS,  DIRECTORY_RINGTONES,  DIRECTORY_ALARMS,  

DIRECTORY_NOTIFICATIONS,  DIRECTORY_PICTURES,  DIRECTORY_MOVIES.  null  

Page 23: Libro Android Español

Almacenamiento  Externo  (III)  Ficheros  comparNdos  con  otras  aplicaciones  Context.getExternalStoragePublicDirectory      (String  type)    Devuelve  un  File  que  representa  el  directorio.  

Type  es  una  de  estas  constantes  (Environment.):          En  este  caso  type  no  puede  ser  null.      

DIRECTORY_MUSIC,  DIRECTORY_PODCASTS,  DIRECTORY_RINGTONES,  DIRECTORY_ALARMS,  DIRECTORY_NOTIFICATIONS,  

DIRECTORY_PICTURES,  DIRECTORY_MOVIES,  DIRECTORY_DOWNLOADS,  DIRECTORY_DCIM  

Page 24: Libro Android Español

Almacenamiento  Externo  (IV)  Acceso  a  ficheros  privados:      

File file = ""new File(getExternalFilesDir(null), "DemoFile.jpg");"

FileOutputStream fos = new FileOutputStream(file);"(…)"fos.close();"

Acceso  a  ficheros  públicos:      

File file = ""new File(getExternalStoragePublicDirectory"

(DIRECTORY_PICTURES), "DemoFile.jpg");"FileOutputStream fos = new FileOutputStream(file);"(…)"fos.close();"

Page 25: Libro Android Español

Almacenamiento  Externo  (V)  La  entrada-­‐salida  en  el  espacio  de  la  aplicación,  sea  interno  o  externo,  no  requiere  permisos.  La  lectura  de  las  carpetas  comparNdas  de  Android  (fotos,  vídeos,  etc)  no  requiere  permisos.  La  escritura  en  las  carpetas  comparNdas  sí  que  requiere  el  permiso:  

 WRITE_EXTERNAL_STORAGE    

Page 26: Libro Android Español

Permisos  Hay  una  serie  de  acciones  en  Android  que  requieren  permisos.  Al  instalar  la  aplicación,  se  muestran  los  permisos  que  la  aplicación  requiere,  para  que  el  usuario  acepte  o  no.  Lista  completa:  hkp://developer.android.com/reference/android/Manifest.permission.html  Resumen  de  permisos  en  castellano:  hkp://www.androidzona.net/analisis-­‐de-­‐los-­‐permisos-­‐en-­‐android/      

Page 27: Libro Android Español

Permisos  (II)  ACCESS_COARSE_LOCATION  Localización  aproximada  (p.e.  por  celdas)  ACCESS_FINE_LOCATION    Localización  precisa  (p.e.  GPS)  ACCESS_WIFI_STATE    Información  sobre  redes  WiFi  BLUETOOTH      Acceder  a  disposiNvos  Bluetooth  emparejados  BLUETOOTH_ADMIN    Descubrir  y  emparejarse  por  Bluetooth  CALL_PHONE      Iniciar  llamadas  sin  confirmación  INTERNET      Permite  abrir  sockets  y  usar  la  red  READ_CALENDAR      Leer  datos  del  calendario  READ_CONTACTS      Obtener  los  contactos  del  teléfono  READ_SMS      Leer  SMS  recibidos  RECEIVE_SMS  (MMS)    Monitorizar  los  SMS  (MMS)  según  se  reciben  SEND_SMS      Enviar  SMS  WRITE_EXTERNAL_STORAGE  Escribir  en  ficheros  externos  USE_SIP        UNlizar  el  servicio  SIP  VIBRATE        Uso  de  la  vibración  WRITE_SMS      Escribir  en  el  almacén  de  SMS  (p.e.  borrar  SMS)  

Page 28: Libro Android Español

Permisos  (III)  

Page 29: Libro Android Español

Permisos  (IV)  

Page 30: Libro Android Español

Permisos  (V)  AndroidManifest.xml  

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="a.com" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:name=".AActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application></manifest>  

Page 31: Libro Android Español

SQLite  

   Buen  manual  de  SQLite:  Android  SQLite  Database  and  ContentProvider.  Lars  Vogel  hkp://www.vogella.de/arNcles/AndroidSQLite/arNcle.html      

Page 32: Libro Android Español

Android  SQLite  (II)  

SQLite  es  un  SGBD  embebido,  disponible  dentro  de  Android.  Sólo  requiere  unos  250kB  de  memoria.  Se  uNliza  SQL  para  definir  las  consultas.  La  gesNón  de  la  BD  la  hace  automáNcamente  Android.  Se  uNliza  el  paquete  android.database      

Page 33: Libro Android Español

Android  SQLite  (III)  Al  final,  SQLite  uNliza  accesos  a  ficheros.  Si  una  aplicación  crea  una  base  de  datos,  se  almacena  en:  DATA/data/APP_NAME/databases/FILENAME  Siendo:    DATA      Carpeta  de  Datos.  Equivale  al  valor  devuelto  por:  

       Environment.getDataDirectory()  APP_NAME  Nombre  de  la  aplicación  FILENAME    Nombre  que  se  da  en  código  a  la  BD      

Page 34: Libro Android Español

Resumen  SQL  -­‐  DML  INSERCIÓN      MODIFICACIÓN      ELIMINACIÓN    CONSULTA  

INSERT  INTO  "nombre_tabla"  ("columna1",  "columna2",  ...)  VALUES  ("valor1",  "valor2",  ...)      UPDATE  "nombre_tabla"  SET  "columna_1"  =  [nuevo  valor]  WHERE  {condición}  DELETE  FROM  "nombre_tabla"  WHERE  {condición}  SELECT  "nombre1_columna",  SUM("nombre2_columna")  FROM  "nombre_tabla"  GROUP  BY  "nombre1_columna"  HAVING  (condición  de  función  aritméNca)ORDER  BY  "nombre_columna"  [ASC,  DESC]  

Page 35: Libro Android Español

SQLiteOpenHelper  Para  crear,  actualizar  y  obtener  acceso  a  una  base  de  datos  SQLite  normalmente  extenderemos  android.database.sqlite.SQLiteOpenHelper.  Redefiniremos  dos  métodos:  void  onCreate(SQLiteDatabase  db)  

 Lo  llama  el  sistema,  si  la  base  de  datos  no  existe.    void  onUpgrade(SQLiteDatabase  db)  

 Es  llamado  si  la  versión  de  BD  del  código  ha  aumentado.  Permite  actualizar  el  esquema  de  la  BD        

Page 36: Libro Android Español

SQLiteOpenHelper  (II)  UNlizaremos  habitualmente:    synchronized  SQLiteDatabase  getReadableDatabase()  

 Devuelve  un  objeto  para  acceder  en  modo  de  solo  lectura.  synchronized  SQLiteDatabase    getWritableDatabase()  

 Devuelve  un  objeto  para  acceder  en  modo  de  lectura-­‐escritura.    Es  una  buena  prácNca  crear  una  clase  por  tabla  de  la  BD,  para  mantener  el  código  organizado  y  legible.    

Page 37: Libro Android Español

SQLiteDatabase  Para  consulta  y  actualizar  la  base  de  datos,  uNlizaremos  SQLiteDatabase.  Para  ello  necesitaremos  abrir  y  cerrar  la  base  de  datos.    staNc  SQLiteDatabase  openOrCreateDatabase  

 (File  file,  SQLiteDatabase.CursorFactory  factory)        Abre  la  Base  de  Datos  

 void  close()  

   Cierra  la  Base  de  Datos      

Page 38: Libro Android Español

SQLiteDatabase  (III)  Inserción  

long  insert    (String  table,  String  nullColumnHack,  ContentValues  values)      Inserta  una  fila  

 table        Nombre  de  la  tabla  nullColumnHack  null,  o  nombre  de  una  columna  si  values  no  

         conNene  ningún  par  columna-­‐valor  values        mapa  de  pares  nombre  de  columna-­‐valor  retorno      ID  de  la  nueva  fila,  o  -­‐1  si  ocurrió  un  error    

Page 39: Libro Android Español

SQLiteDatabase  (IV)  Actualización  

int  update      (String  table,  ContentValues  values,  String  whereClause,  

String[]  whereArgs)    table        Nombre  de  la  tabla  values        mapa  de  pares  nombre  de  columna-­‐valor  whereClause    condición  de  WHERE  

         Ej:  “_id  =  ?”  whereArgs      lista  de  Strings  que  susNtuyen  a  ?,  o  null  

         Ej:  new  String[]{“1”,”3”,”5”}  retorno      Número  de  filas  afectadas    

Page 40: Libro Android Español

SQLiteDatabase  (V)  Eliminación  

int  delete  (String  table,  String  whereClause,  String[]  whereArgs)    

 table        Nombre  de  la  tabla  whereClause    condición  de  WHERE  

         Ej:  “_id  =  ?”  whereArgs      lista  de  Strings  que  susNtuyen  a  ?,  o  null  

         Ej:  new  String[]{“1”,”3”,”5”}  retorno      Número  de  filas  afectadas  si  whereClause  no  

         es  null,  0  si  lo  es  (todas  serán  afectadas)    

Page 41: Libro Android Español

SQLiteDatabase  (VI)  Consulta  

Cursor  query  (String  table,  String[]  columns,  String  selecNon,  String[]  selecNonArgs,  String  groupBy,  String  having,  String  orderBy)  table        Nombre  de  la  tabla  columns      Las  columnas.  null  para  devolver  todas  selecUon      condición  de  WHERE,  o  null  para  todas  las  filas  

         Ej:  “_id  =  ?”  selecUonArgs    lista  de  Strings  que  susNtuyen  a  ?,  o  null  

         Ej:  new  String[]{“1”,”3”,”5”}  groupBy      Argumentos  de  GROUP  BY,  o  null  si  no  aplica  having        Argumentos  de  HAVING,  o  null  si  no  aplica  orderBy      Argumentos  de  ORDER  BY,  o  null  si  no  aplica  retorno      Un  cursor  posicionado  en  la  primera  entrada    

Page 42: Libro Android Español

SQLiteDatabase  (VII)  Comandos  libres  

Hay  dos  funciones  muy  úNles  para  enviar  consultas  y  comandos  directamente  en  SQL.    Cursor  rawQuery(String  sql,  String[]  selecNonArgs)    sql          Consulta  en  SQL  selecUonArgs    Array  de  argumentos  a  susNtuir  por  los  ?  retorno      Un  cursor  posicionado  en  la  primera  entrada    void  execSQL(String  sql)    sql          Comando  en  SQL  que  NO  devuelva  resultados    

Page 43: Libro Android Español

Ejemplo  PrácNco:  Base  de  Datos  (vogella)  

Page 44: Libro Android Español

Ejemplo  Base  de  Datos  

Realizar  una  aplicación  para  Android  2.2  que  guarde  una  l i s t a   p e r s i s t e n t e   d e  entradas.  Tendrá   dos   botones,   para  añadir  una  entrada  nueva  y  para   borrar   la   primera  entrada.