Desarrollo de aplicaciones Android Desarrollo de aplicaciones Android Mecanismos de persistencia Preferencias ● Preferencias ● Sistema de ficheros (privado) ● Bases de datos SQLite ● ● ● Almacenamiento externo (público) ● Conexiones de red ● App. Lista de tareas © Grupo Arco 2 Las preferencias son una forma sencilla (aunque limitada) para guardar configuración de una aplicación. Se almacenan pares clave-valor. Parecido al registro de Windows o al servicio gconf de GNOME. Los valores pueden tener solo tipos de datos básicos. App. Lista de tareas © Grupo Arco Desarrollo de aplicaciones Android Desarrollo de aplicaciones Android Preferencias Almacenamiento interno ● public class Settings extends Activity { public static final String PREFS_NAME = "MySettings"; @Override protected void onCreate(Bundle state){ super.onCreate(state); settings = getSharedPreferences(PREFS_NAME, 0); silent = settings.getBoolean("silentMode", false); } ● © Grupo Arco En Android el sistema de ficheros es local, solo accesible para la propia aplicación. Streams de entrada y salida similares a los estándar de Java. String string = "hello world!"; @Override protected void onStop(){ super.onStop(); settings = getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean("silentMode", silent); editor.commit(); } App. Lista de tareas 3 FileOutputStream fos = openFileOutput(“hello.txt”, Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close(); 4 App. Lista de tareas © Grupo Arco 5 ● ● Desarrollo de aplicaciones Android Desarrollo de aplicaciones Android Bases de datos: SQLite database.sqlite.SQLiteOpenHelper Es una base de datos SQL ligera. Es una clase para encapsular el acceso a la base de datos. Las consultas retornan «cursores»: objetos que pueden utilizarse para iterar sobre los datos devueltos. ● Métodos importantes: moveTo... ● getCount ● getColumnName ● getPosition App. Lista de tareas © Grupo Arco 6 ● onCreate ● onUpgrade ● onDestroy App. Lista de tareas © Grupo Arco Desarrollo de aplicaciones Android Desarrollo de aplicaciones Android TaskHelper onCreate / onUpgrade / onDestroy @Override public void onCreate(SQLiteDatabase db) { db.execSQL("CREATE TABLE tasks (_id INTEGER PRIMARY KEY AUTOINCREMENT, description INT, priority INT, day INT, month INT, year INT);"); } class TaskHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME="TaskList.db"; private static final int SCHEMA_VERSION=1; private Cursor cursor = null; public TaskHelper(Context context) { super(context, DATABASE_NAME, null, SCHEMA_VERSION); cursor = this.getAll(); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } private Cursor getAll() { return(getReadableDatabase().rawQuery("SELECT _id, description, priority, day, month, year FROM tasks ORDER BY _id", null)); } Abre la base de datos App. Lista de tareas public void onDestroy() { cursor.close(); } Realiza una consulta SQL y obtiene Todos los registro © Grupo Arco 7 Libera el cursor 8 App. Lista de tareas Encargada de crear la base de datos si no existe. Utilizada para modificar la base De datos si hay cambio de versión © Grupo Arco 9 Desarrollo de aplicaciones Android Desarrollo de aplicaciones Android Guardando tareas Recuperando tareas Se añaden los métodos necesarios para manipular el almacenamiento: public Task getTaskFromCursor(Cursor c) { Task t = new Task(c.getString(1), c.getInt(2), c.getInt(3), c.getInt(4), c.getInt(5)); return t; } Contenedor genérico de valores public void add(Task task) { ContentValues cv=new ContentValues(); cv.put("description", task.getDescription()); cv.put("priority", task.getPriority()); Acceso de escritura a la BBDD cv.put("day", task.getDay()); cv.put("month", task.getMonth()); cv.put("year", task.getYear()); getWritableDatabase().insert("tasks", "description", cv); // resto de inserts cursor.requery(); } public Task get(int position) { cursor.moveToPosition(position); return getTaskFromCursor(cursor); } public void remove(int position) { this.db.delete(TaskHelper.DB_TABLE, "_id=" + position, null); } App. Lista de tareas ● © Grupo Arco 10 Desarrollo de aplicaciones Android Desarrollo de aplicaciones Android Aplicación «Lista de tareas» TaskAdapter Cambiamos nuestro ArrayList<Task> por el TaskHelper. ● ● Los datos ahora se almacenarán en una BBDD, en lugar de la lista variable ● TaskHelper tasks = new TaskHelper(this); ● App. Lista de tareas © Grupo Arco 11 Reemplazamos el Adaptador de la lista por otro adecuado a la BBDD (derivado de CursorAdapter) El adaptador debe manejar ahora 2 eventos: Inicializamos el cursor de SQLite; startManagingCursor(tasks.getCursor()); class TaskAdapter extends CursorAdapter { TaskAdapter() { super(TodoList.this, tasks.getCursor()); } } App. Lista de tareas © Grupo Arco 12 App. Lista de tareas © Grupo Arco 13 Desarrollo de aplicaciones Android TaskAdapter ● El adaptador debe manejar 2 eventos Clase encargada de rellenar la fila Asocia una vista (fila) existente con un cursor Crea una nueva vista (fila) 1. Al crear la vista se asocia como una etiqueta 2. al asociar la vista, se encarga de visualizar la inf. contenida en el cursor @Override public void bindView(View row, Context ctxt, Cursor c) { TaskHolder holder = (TaskHolder)row.getTag(); holder.populateFrom(tasks.getTaskFromCursor(c)); } @Override public View newView(Context ctxt, Cursor c, ViewGroup parent) { LayoutInflater inflater = getLayoutInflater(); View row = inflater.inflate(R.layout.row, parent, false); TaskHolder holder = new TaskHolder(row); row.setTag(holder); return(row); } App. Lista de tareas © Grupo Arco 14