En este video te explicamos en detalle todo el proceso para publicar una Aplicación Android…
Proyecto Content Provider personalizado (II)
5.
Proyecto Content Provider personalizado (II)
Continuamos con el segundo proyecto para ver la implementación práctica de un Content Provider personalizado.
En el anterior proyecto, que denominamos CarteraClientes, vimos la creación del Content Provider utilizando una base de datos SQLite para insertar datos de clientes, y en este segundo, que denominaremos ClienteProvider solicitaremos los datos de dicho Content Provider, utilizando la clase ContentResolver.
Elementos del proyecto Android ClienteProvider
Enumeramos los elementos necesarios para el desarrollo de este segundo proyecto:
- Clase MainActivity, que herede de la clase base ListActivity, encargada de mostrar los datos solicitados por el ContentResolver, y mostrarlos en un componente ListView.
- Clase AdaptadorCliente, que herede de la clase base BaseAdapter, encargada de construir la vista de cada uno de los ítems que se mostrarán en el componente ListView.
- Clase Cliente, que permita crear nuevos objetos Cliente, formado por los métodos getters y setters (métodos de acceso a propiedades).
- Layout
activity_main.xml
, formado por un componente de tipo selección ListView, encargado de mostrar los clientes almacenados, y un componente de tipo Button que permitirá eliminar el registro seleccionado por el usuario. - Layout
activity_adaptador_cliente.xml
, que construirá la vista de cada ítem del componente ListView. Se definen tres componentes de tipo TextView.
Estructura del proyecto
Vemos aquí la estructura del proyecto ClienteProvider:
Código fuente del proyecto ClienteProvider
Presentamos las diferentes clases y ficheros layout que componen este Proyecto, así como la creación y estructura de la base de datos Clientes. Como siempre, puedes descargarte todo el código al final de este tutorial
ClienteProvider\src\com\academiaandroid\clienteprovider\MainActivity.java
1. Se crea una nueva clase llamada MainActivity, que hereda de la clase base ListActivity, encargada de mostrar los datos solicitados por el ContentResolver, y mostrarlos en un componente ListView:
1 2 |
public class MainActivity extends ListActivity { |
2. Dentro del método onCreate()
, se enlazan los componentes con sus recursos a nivel de layout, y se invoca al método setAdapter(), recibiendo como argumento la instancia de la clase AdaptadorCliente(), cuyo constructor está compuesto por el contexto y un ArrayList de objetos Cliente, que devuelve el método mostrarRegistrosAplicacion():
1 2 3 4 5 6 7 8 9 10 11 12 |
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); listaClientes = (ListView)findViewById(android.R.id.list); txtInfoDescripcion = (TextView)findViewById(R.id.txtInfoDescripcion); listaClientes.setAdapter(new AdaptadorCliente(this, mostrarRegistrosAplicacion())); [...] } |
ClienteProvider\src\com\academiaandroid\clienteprovider\Cliente.java
1. Se define una clase Cliente, que permitirá crear nuevos objetos, con los datos de cada registro de la base de datos (métodos getters y setters):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public class Cliente { private String id; private String cliente; private String telefono; private String descripcion; public Cliente(String id, String cliente, String telefono, String descripcion) { this.id = id; this.cliente = cliente; this.telefono = telefono; this.descripcion = descripcion; } [...] } |
2. Dentro de esta clase, también se define el método mostrarRegistrosAplicacion()
, permite consultar la tabla Clientes, almacenando los resultados en un objeto Cursor. Este método devuelve un ArrayList de objetos Cliente, con todos los registros almacenados:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
public ArrayList<Cliente> mostrarRegistrosAplicacion() { ArrayList<Cliente> objetoCliente = new ArrayList<Cliente>(); /*Se declara e incializa la clase ContentResolver, referenciándole al método getContentResolver(), que nos permitirá acceder a los métodos sobrescritos en la clase que hereda de la clase base ContentProvider*/ ContentResolver resolver = getContentResolver(); Cliente cliente; try{ c = resolver.query(CompartirDatos.CONTENT_URI, CompartirDatos.columnas, null, null, null); if(c != null) { if(c.moveToFirst()) { Log.i("MainActivity", "Si devuelve cursor"); do { cliente = new Cliente(c.getString(0), c.getString(1), c.getString(2), c.getString(3)); objetoCliente.add(cliente); }while(c.moveToNext()); } }else { Log.i("MainActivity", "No devuelve cursor"); Toast.makeText(this, "El objeto cursor está vacío.", Toast.LENGTH_LONG).show(); } }catch(Exception ex) { ex.getMessage(); } return objetoCliente; } |
ClienteProvider\src\com\academiaandroid\clienteprovider\AdaptadorCliente.java
1. Se crea una nueva clase llamada AdaptadorCliente, que heredará de la clase base BaseAdapter, encargada de construir la vista de cada uno de los ítems que se mostrarán en el componente ListView:
1 2 |
public class AdaptadorCliente extends BaseAdapter{ |
2. Por último se construye la vista por cada ítem, sobrescribiendo el método getView() (devuelve un objeto de tipo View), a partir del ArrayList recibido y la posición que ocupa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
@Override public View getView(int position, View convertview, ViewGroup parent) { View v = convertview; ViewHolder vista = new ViewHolder(); if(convertview == null) { v = inflater.inflate(R.layout.activity_adaptador_cliente, parent, false); /*Se asocian los controles de tipo TextView con sus recursos a nivel de layout.*/ vista.txtId = (TextView)v.findViewById(R.id.txtId); vista.txtCliente = (TextView)v.findViewById(R.id.txtCliente); vista.txtTelefono = (TextView)v.findViewById(R.id.txtTelefono); /*Se asignan a cada componente el índice de la columna a mostrar, a partir de los resultados de la consulta procesada. En cada ítem del componente de selección ListView se mostrarán los registros de id, cliente y teléfono almacenado.*/ vista.txtId.setText(" | Id: " + cliente.get(position).getId() + " | "); vista.txtCliente.setText("Cliente: " + cliente.get(position).getCliente() + " |"); vista.txtTelefono.setText("Telefono: " + cliente.get(position).getTelefono() + " | "); } else { vista = (ViewHolder) v.getTag(); } return v; } |
ClienteProvider\res\layout\activity_main.xml
- A nivel de layout (
activity_main.xml
), se implementa un componente de tipo selección ListView, encargado de mostrar los clientes almacenados, además de añadir un componente de tipo Button encargado de eliminar el registro seleccionado por el usuario:
12345678910111213141516171819202122232425262728293031[...]<TableRowandroid:id="@+id/tableRow3"android:layout_width="wrap_content"android:layout_height="wrap_content" ><ListViewandroid:id="@android:id/list"android:layout_width="match_parent"android:layout_height="224dp"android:layout_weight="0.29"android:background="@color/rojo"android:cacheColorHint="@android:color/transparent"android:divider="@android:color/black"android:dividerHeight="3dp"android:scrollbarStyle="outsideOverlay" ></ListView><Buttonandroid:id="@+id/btnEliminarRegistro"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="eliminarRegistro"android:text="@string/eliminar" /></TableRow>[...]
ClienteProvider\res\layout\activity_adaptador _ cliente.xml
- Se define un nuevo layout denominado
activity_adaptador_cliente.xml
, que construirá la vista de cada ítem del componente ListView. Se definen tres componentes de tipo TextView para mostrar información de cada fila de un registro (campo _id, cliente y telefono):
123456789101112131415161718192021222324252627<TableRowandroid:id="@+id/tableRow1"android:layout_width="wrap_content"android:layout_height="wrap_content" ><TextViewandroid:id="@+id/txtId"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/campoVacio" /><TextViewandroid:id="@+id/txtCliente"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="5dp"android:text="@string/campoVacio" /><TextViewandroid:id="@+id/txtTelefono"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="20dp"android:text="@string/campoVacio" /></TableRow>
Consultas Transact-SQL
- Crear base de datos «Clientes»:
12CREATE DATABASE Clientes; - Crear tabla «NuevosClientes»:
12345CREATE TABLE NuevosClientes (_id INTEGER PRIMARY KEY AUTOINCREMENT,cliente TEXT,telefono TEXT,descripcion TEXT);
Estructura base de datos «Clientes.sqlite»
Vemos en esta imagen la estructura de dicha base de datos:
Descarga proyecto
Download
En la próxima y última publicación de esta serie, explicaremos en un video ambos proyectos y mostraremos sus funcionalidades.