Libro Android Español
-
Upload
angel-cruz -
Category
Documents
-
view
62 -
download
0
Transcript of Libro Android Español
Programación Android
Rafael Morón Abad [email protected]
3.5. Persistencia
Persistencia Para poder almacenar información persistente, Android nos proporciona 3 mecanismos: 1. Preferencias 2. Ficheros 3. BBDD SQLite DATOS
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
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
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)
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.
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.
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.
Ejemplo PrácNco: Preferencias
Preferencias
Realizar una aplicación para Android 2.2 que esc r iba datos en un SharedPreferences y los muestre en un TextView
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.
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.
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.
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
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();"""
Ejemplo PrácNco: Lista de la compra
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”.
Ejemplo PrácNco: Lista de la compra con Interfaz de Usuario
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
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
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
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
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();"
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
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/
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)
Permisos (III)
Permisos (IV)
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>
SQLite
Buen manual de SQLite: Android SQLite Database and ContentProvider. Lars Vogel hkp://www.vogella.de/arNcles/AndroidSQLite/arNcle.html
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
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
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]
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
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.
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
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
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
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)
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
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
Ejemplo PrácNco: Base de Datos (vogella)
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.