android: almacenar datos, representar listas
/índice:
Gradle
Herramienta para automatización de tareas como:
- Compilar
- Enlazar librerías
- Firmar
- Ejecutar
Usa un DSL (lenguaje de dominio específico) basado en Groovy y un DAG (gráfico acíclico dirigido) para fijar el orden de ejecución de tareas.
Fichero: build.gradle
SharedPreferences
Almacenamiento de variables en un entorno privado a la app. Es un fichero XML no compartido con otras aplicaciones, en el que se guardan pares clave-valor de tipos sencillos.
Almacenar datos:
SharedPreferences settings = getSharedPreferences("Config", 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("alarm_active", alarmActive);
editor.putString("username", username);
editor.commit();
Recuperar datos:
SharedPreferences settings = getSharedPreferences("Config", 0);
boolean alarmActive = settings.getBoolean("alarm_active", false);
String username = settings.getString("username", "");
Bases de Datos
SQLite
En Android usamos SQLite, que es una RDBMS: Relational-DBMS (DataBase Management System). Cualquier acción para crear, leer, actualizar y borrar (CRUD) debe programarse.
ORM (Object-Relational Mapper): Crea relaciones entre bases de datos y objetos Java. Permite un lenguaje más evidente (DAO - Data Access Object). Ejemplo con GreenDao:
// para acceder a la base de datos:
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "db", null);
SQLiteDatabase db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
// getObjectDao tantas veces como se necesite
objectDao = daoSession.getObjectDao();
List<MyObject> objectsList = objectDao.queryBuilder().orderDesc(ObjectDao.Properties.Name).list();
// MyObject es una entidad de GreenDao
GreenDAO
Instalar y configurar la librería: http://greenrobot.org/greendao/documentation/introduction
En build.gradle que está en la carpeta raíz del proyecto:
- Añadir repositorio
mavenCentral()
- Añadir
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
En el build.gradle de la app:
- Al inicio del fichero:
apply plugin: 'org.greenrobot.greendao'
- Añadir
compile 'org.greenrobot:greendao:3.2.2'
Creamos al menos un modelo: http://greenrobot.org/greendao/documentation/modelling-entities Primero definimos la versión del schema. En el build.gradle de la app, añadimos:
greendao {
schemaVersion 2
}
Ahora anotamos nuestro modelo (crear métodos getter, setter y constructores). Ejecutamos Make > Build project.
Lists y Adapters
Para crear listados necesitamos:
- Elemento de layout:
ListView
- Listado vertical de celdas
- Cada celda es un layout independiente
- Clase que gestiona una celda:
Adapter
- Indica cómo se tiene que mostrar cada celda
- Relación directa con la celda
- Diversos tipos:
BaseAdapter, SimpleAdapter, ArrayAdapter
…
ListView
El elemento ListView es un elemento de layout más:
<ListView
android:id="@+id/example_list"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
pero para determinar su contenido se debe asignar un Adapter:
ListView lvList = (ListView) findViewById(R.id.example_list);
lvList.setAdapter(new MyAdapter(objectsList));
Adapter
Podemos crear nuestro Adapter usando extends BaseAdapter
. Requiere implementar 4 métodos:
public int getCount() {···}
public Object getItem(int position) {···}
public long getItemId(int position) {···}
//Ejemplo más detallado de método getView:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_cell, null, false);
//list_cell.xml es el layout de cada celda de la lista
}
//TODO
return convertView;
}
Click event
Es necesario crear un click listener particular: AdapterView.OnItemClickListener
. Funciona parecido al click listener de un botón, pero con
una posición.
Ejemplo:
public class MyListItemClickListener implements AdapterView.OnItemClickListener {
private List<MyObject> myList;
private Activity activity;
public MyListItemClickListener(List<Object> objects, MyListActivity myListActivity) {
this.myList = objects;
this.activity = myListActivity;
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//TODO
}
}
[Telegram]