Programación Android, Ejemplo de Bases de datos & ListView III

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0

Android SQLite

En la entrada anterior sobre el manejo de bases de datos nos quedamos en el punto en que habíamos copiado los datos de una tabla a otra, pero nos faltaba mostrarlos en el segundo ListView, que iba a contener un Adapter personalizado para poder mostrar los 3 campos que guardamos en la tabla.

Crear el Adapter personalizado

El Adapter lo vamos a crear siguiendo los pasos que ya dijimos en las entradas:

En primer lugar crearemos la vista del ítem del ListView, con 3 TextView en los que mostrar los datos:

<!--?xml version="1.0" encoding="utf-8"?-->








A continuación creamos la clase Holder:

public class HolderLVTabla2 {
	public TextView tvNombre;
	public TextView tvApellido;
	public TextView tvTelefono;
}

Lo siguiente a realizar es crear la clase Adapter para nuestro ListView, con la diferencia, con respecto al ejemplo de Adapter personalizado antes mostrado, de que en este caso los datos en lugar de mandarlos a través del constructor, los recuperaremos a través de Application:

public class AdapterLVTabla2 extends ArrayAdapter {

	private Context context;
	// Collección que contiene todos los datos de la tabla2, utilizamos la clase
	// Modelo DatosTabla para guardarlos en el ArrayList y posteriormente
	// acceder a los datos.
	private ArrayList datos;

	public AdapterLVTabla2(Context context) {
		super(context, R.layout.lvtabla2_item, ((BDApplication) context
				.getApplicationContext()).getDatosTabla2());

		this.context = context;
		datos = ((BDApplication) context.getApplicationContext())
				.getDatosTabla2();
	}

}

Como podemos ver, llamamos al método getDatosTabla2() de la clase BDApplication que aún no hemos creado, y que debe devolver una colección con todos los datos de la tabla. Crearemos el método a continuación, siguiendo la misma filosofía que con los anteriores métodos que hemos creado en esta clase:

/**
* Recoge los datos de la tabla2.
*
* @return ArrayList
*/
public ArrayList getDatosTabla2() {
	Cursor c = dbAdapter.getDatosTabla2();
	return CursorToCollection.cursorToArrayListDatosTabla2(c);
}

Creamos el método que necesitamos en DBAdapter, que a su vez llamará a otro método de la clase Tabla2:
En DBAdapter:

/**
* Devuelve el cursor con todos los datos de la tabla.
*
* @return Cursor
*/
public Cursor getDatosTabla2() {
	return tabla2.getDatos();
}

En Tabla2:

/**
* Devuelve el cursor con todos los datos de la tabla.
*
* @return Cursor
*/
public Cursor getDatos() {
	return sqlDB.query(NAME, COLUMNS, null, null, null, null, null);
}

El siguiente paso es crear el método en la clase CursorToCollection que pasará los datos del cursor a un ArrayList:

/**
* Convierte un objeto Cursor en un ArrayList con los datos de la tabla2
* @param c
* @return ArrayList
*/
public static ArrayList cursorToArrayListDatosTabla2(Cursor c) {
	ArrayList datos = new ArrayList();
	// Comprobamos si contiene datos el cursor.
	if (c.moveToFirst()) {
		// Declaramos variables que necesitamos para crear un objeto DatosTabla.
		int id;
		String nombre, apellido, telefono;
		do {
			// Recuperamos el ID de la tupla.
			id = c.getInt(c.getColumnIndex(Tabla2.Columns.ID));
			// Recuperamos el nombre.
			nombre = c.getString(c.getColumnIndex(Tabla2.Columns.NOMBRE));
			// Recuperamos el apellido.
			apellido = c.getString(c.getColumnIndex(Tabla2.Columns.APELLIDO));
			// Recuperamos el teléfono.
			telefono = c.getString(c.getColumnIndex(Tabla2.Columns.TELEFONO));

			// Añadimos un nuevo objeto DatosTabla al ArrayList.
			datos.add(new DatosTabla(id, nombre, apellido, telefono));
		} while (c.moveToNext());
	}
	// Devolvemos la colección de datos.
	return datos;
}

Y por último sólo nos queda sobreescribir el método getView() de la clase AdapterLVTabla2 para que se muestren todos los datos en el ListView posteriormente:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
	HolderLVTabla2 holder;
	// Si la vista viene como null tendremos que crearla por vez primera, de
	// lo contrario la reutilizaremos y actualizaremos los datos.
	if (convertView == null) {
		LayoutInflater inflater = LayoutInflater.from(context);
		// Inicializamos la vista.
		convertView = inflater.inflate(R.layout.lvtabla2_item, null);

		// Creamos el holder que contendrá la referencia a los TextView de
		// la vista.
		holder = new HolderLVTabla2();
		holder.tvNombre = (TextView) convertView
				.findViewById(R.id.tvNombre);
		holder.tvApellido = (TextView) convertView
				.findViewById(R.id.tvApellido);
		holder.tvTelefono = (TextView) convertView
				.findViewById(R.id.tvTelefono);
		// Guardamos el holder en el Tag de la vista para recuperarlo
		// posteriormente.
		convertView.setTag(holder);
	}

	// Recuperamos el holder del Tag.
	holder = (HolderLVTabla2) convertView.getTag();
	// Actualizamos los datos de los TextView.
	holder.tvNombre.setText(datos.get(position).getNombre());
	holder.tvApellido.setText(datos.get(position).getApellido());
	holder.tvTelefono.setText(datos.get(position).getTelefono());

	// Devolvemos la vista para que se muestre en el ListView.
	return convertView;
}

Actualizar el ListView

Finalmente sólo tendremos que crear el objeto ListView en la Activity, inicializarlo y asignarle el Adapter al en la Activity:

private ListView lvTabla2;
@Override
protected void onCreate(Bundle savedInstanceState) {
	/* ... */
	AdapterLVTabla2 adapterTabla2 = new AdapterLVTabla2(this);

	lvTabla2 = (ListView) findViewById(R.id.lvTabla2);
	lvTabla2.setAdapter(adapterTabla2);
}

Con esto habremos asignado el Adapter al ListView, y al iniciar la aplicación mostrará todos los datos en el ListView, sin embargo podremos ver que no se muestran en el ListView. Esto es porque el Adapter aún no ha actualizado los datos que contiene. Para actualizar estos datos vamos a crear un método update() en nuestra clase Adapter, que va a eliminar en primer lugar todos los datos que se asignaron en el constructor, al llamar al constructor de la clase base, posteriormente vamos a actualizar la colección de datos y por último vamos a volver a añadir los datos actualizados:

/**
* Actualiza la colección de datos completa del Adapter.
*/
public void update() {
	// Eliminamos todos los datos asignados al Adapter.
	if (datos.size() > 0)
		for (DatosTabla dato : datos)
			remove(dato);

	// Actualizamos la colección de datos.
	datos = ((BDApplication) context.getApplicationContext())
			.getDatosTabla2();

	// Añadimos los nuevos datos al Adapter.
	if (datos.size() != 0)
		for (DatosTabla dato : datos)
			add(dato);

	// Para versiones de API mínimas de 11 se puede utilizar este método,
	// para versiones anteriores obligatoriamente debemos añadir cada dato
	// con el foreach de arriba.
	// if(datos.size() != 0)
	// addAll(datos);
}

Y sólo nos falta llamar a este método en el evento onClick() de nuestra Activity, en el que hacíamos la copia de la tabla1 a la tabla2, después de hacer la copia:

@Override
public void onClick(View v) {
	((BDApplication)getApplication()).copiarTabla1ATabla2();
	adapterTabla2.update();

}

Y ahora sí, veremos que en el momento en que damos a copiar los datos de la tabla1 a la tabla2 también se actualizará el ListView que nos muestra los datos de la tabla2.

Borrar datos de la tabla y del ListView

Por último, para borrar los datos de la tabla2 vamos a habilitar el botón que nos falta. Creamos la instancia del botón borrar y le suscribimos al Listener onClickListener:

private Button btCopiar, btBorrar;

@Override
protected void onCreate(Bundle savedInstanceState) {
	/* ... */

	btCopiar = (Button) findViewById(R.id.btnCopiar);
	btCopiar.setOnClickListener(this);

	btBorrar = (Button) findViewById(R.id.btnBorrar);
	// Suscribimos el boton borrar al evento onClick()
	btBorrar.setOnClickListener(this);
}

@Override
public void onClick(View v) {
	// Creamos un switch para comprobar cuál de los dos botones hace
	// la llamada al evento.
	switch (v.getId()) {
	case R.id.btnCopiar:
		// Si es el botón copiar hacemos la copia de una tabla a otra.
		((BDApplication) getApplication()).copiarTabla1ATabla2();

		break;
	case R.id.btnBorrar:
		// Si es el botón borrar borramos los datos de la tabla2.
		((BDApplication) getApplication()).borrarTabla2();

		break;
	}
	// Una vez realizada la acción de copia o borrado de datos
	// actualizamos el Adapter.
	adapterTabla2.update();

}

Como siempre, estamos llamando a un método de la clase Application que aún no existe, por lo tanto vamos a crearlo:

/**
* Borra todos los datos de la tabla2.
*
* @return true si se borran correctamente.
*/
public boolean borrarTabla2() {
	return dbAdapter.borrarTabla2();

}

Y a continuación lo creamos en la clase DBAdapter:

/**
* Borra todos los datos de la tabla2.
*
* @return true si se borran correctamente.
*/
public boolean borrarTabla2() {
	return tabla2.borrarTabla();
}

Y por último en la clase Tabla2:

/**
* Borra todos los datos de la tabla2.
*
* @return true si se borran correctamente.
*/
public boolean borrarTabla() {
	return sqlDB.delete(NAME, null, null) > 0;

}

Con esto solo nos falta por hacer que se lance una segunda Activity cuando pulsemos sobre uno de los items del segundo ListView, para modificar los datos que queramos. En la siguiente entrada completaremos el ejemplo de manejo de bases de datos y ListView.

Descargas

Puedes ver el resultado del ejemplo en tu móvil descargando nuestra aplicación desde Google Play.

El código que llevamos realizado hasta el momento puede descargarse aquí.

Share if you like...Share on Facebook0Tweet about this on TwitterShare on Google+0Share on LinkedIn0
The following two tabs change content below.
Reborn as IT Developer. Desarrollador Android y fundador de Proyecto Simio. "En realidad, yo no puedo enseñar nada a nadie, sólo puedo hacerles pensar." - Sócrates.

One thought on “Programación Android, Ejemplo de Bases de datos & ListView III

Deja un comentario