En este video te explicamos en detalle todo el proceso para publicar una Aplicación Android…
Proyecto Android: Content Provider personalizado (I)
4.
Proyecto Android: Content Provider personalizado (I)
En las próximas publicaciones vamos desarrollar dos proyectos Android para ver de forma práctica la implementación de un Content Provider personalizado.
En el primero, que publicamos en este tutorial, crearemos un Content Provider personalizado, que implementa una base de datos SQLite para insertar datos de clientes. En el segundo, solicitaremos los datos de dicho Content Provider, utilizando la clase ContentResolver.
Puedes descargar el código completo al final de cada tutorial,
Elementos del proyecto Android Content Provider personalizado
Enumeramos en primer lugar los elementos necesarios para el desarrollo del primer proyecto denominado CarteraClientes
- Clase MainActivity, que herede de la clase base Activity, encargada de mostrar la lógica de inserción de registros (menú principal de la aplicación).
- Clase EstructuraDatos, que implementa la interfaz BaseColumns, y permite declarar e inicializar las variables que definen el nombre de la tabla y los campos creados.
- Clase BaseDatos, que herede de la clase base SQLiteOpenHelper, encargada de sobrescribir los métodos para la creación, actualización y consulta a una Base de Datos.
- Clase CompartirDatos, que herede de la clase base ContentProvider, encargada de establecer los mecanismos necesarios para intercambiar información con el resto de aplicaciones.
- Layout
activity_main.xml
formado por tres componentes de tipos EditText, que recogerán los datos introducidos por el usuario, y un componente de tipo Button encargado de enviar los datos introducidos.
Estructura del proyecto Android
Vemos aquí la estructura del proyecto CarteraClientes:
Documentación código fuente del proyecto
Presentamos las diferentes clases y el fichero de layout que componen el Proyecto CarteraClientes. Como siempre, puedes descargarte todo el código al final de este tutorial
CarteraClientes\src\com\academiaandroid\carteraclientes\MainActivity.java
1.Se implementa la clase MainActivity, que hereda de la clase base Activity, encargada de mostrar la lógica de inserción de registros:
1 2 |
public class MainActivity extends Activity { |
2.Se enlazan los componentes con sus recursos a nivel de layout:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); edCliente = (EditText)findViewById(R.id.edCliente); edTelefono = (EditText)findViewById(R.id.edTelefono); edDescripcion = (EditText)findViewById(R.id.edDescripcion); txtTotalRegistros = (TextView)findViewById(R.id.txtTotalRegistros); [...] } |
3.Se define el evento onClick guardarDatos()
para insertar los datos introducidos en los campos EditText:
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 |
public void guardarDatos(View view) { String cliente = edCliente.getText().toString(); String telefono = edTelefono.getText().toString(); String descripcion = edDescripcion.getText().toString(); if(cliente.equals("") || telefono.equals("") || descripcion.equals("")) { Toast.makeText(this, "Es necesario que introduzca todos los datos.", Toast.LENGTH_LONG).show(); }else { /*Declaramos e inicializamos la clase ContentValues, para almacenar los datos del nuevo registro.*/ ContentValues values = new ContentValues(); values.put(EstructuraDatos.COLUMN_NAME_CLIENTE, cliente); values.put(EstructuraDatos.COLUMN_NAME_TELEFONO, telefono); values.put(EstructuraDatos.COLUMN_NAME_DESCRIPCION, descripcion); /*Se invoca al método insert(), indicando la URI definida y los valores a insertar entre sus argumentos.*/ getContentResolver().insert(CompartirDatos.CONTENT_URI, values); refrescarPantalla(); Toast.makeText(this, "Se ha almacenado un nuevo cliente: " + cliente, Toast.LENGTH_LONG).show(); edCliente.setText(""); edTelefono.setText(""); edDescripcion.setText(""); } } |
CarteraClientes\src\com\academiaandroid\carteraclientes\EstructuraDatos.java
- Se define una clase llamada EstructuraDatos, que implementa la interfaz BaseColumns, que permite declarar e inicializar las variables que definen el nombre de la tabla y los campos creados:
12345678public class EstructuraDatos implements BaseColumns{public static final String TABLE_NAME = "NuevosClientes";public static final String COLUMN_NAME_CLIENTE = "cliente";public static final String COLUMN_NAME_TELEFONO = "telefono";public static final String COLUMN_NAME_DESCRIPCION = "descripcion";}
CarteraClientes\src\com\academiaandroid\carteraclientes\CompartirDatos.java
1.Se crea una nueva clase llamada CompartirDatos, que heredará de la clase base ContentProvider, encargada de establecer los mecanismos necesarios para intercambiar información con el resto de aplicaciones:
1 2 |
public class CompartirDatos extends ContentProvider { |
2.Se declara e inicializa una constante de la clase Uri, que recogerá la URI que identificará de manera única al Content Provider:
1 2 3 |
private static final String AUTORIDAD = "com.academiaandroid.carteraclientes.CompartirDatos"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTORIDAD + "/" + EstructuraDatos.TABLE_NAME); |
3.Se declara e inicializa un array de Strings, que contendrá todos los campos de la tabla creada:
1 2 3 4 5 |
public static String[] columnas = new String[]{EstructuraDatos._ID, EstructuraDatos.COLUMN_NAME_CLIENTE, EstructuraDatos.COLUMN_NAME_TELEFONO, EstructuraDatos.COLUMN_NAME_DESCRIPCION}; |
4.Se sobrescribe el método delete()
, que procesará las solicitudes de eliminación de datos, recibiendo entre sus parámetros la URI del Content Provider, y los argumentos de selección y orden definidos. Este método devuelve el número de filas afectadas:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@Override public int delete(Uri uri, String selection, String[] arg2) { int id; String where = selection; if(uriMatcher.match(uri) == CLIENTES_ID) { /*Se establece la cláusula WHERE con la condición del campo y valor como condición de eliminación.*/ where = EstructuraDatos._ID + "=" + uri.getLastPathSegment(); } db = datos.getReadableDatabase(); /*Se invoca al método delete(), indicando entre sus argumentos la tabla, y la cláusula WHERE con la condición que debe cumplir el registro a eliminar.*/ id = db.delete(EstructuraDatos.TABLE_NAME, where, arg2); return id; } |
5.Se sobrescribe el método insert()
, que posibilita la inserción de datos, devolviendo la URI que hace referencia al registro introducido:
1 2 3 4 5 6 7 8 9 |
@Override public Uri insert(Uri uri, ContentValues values) { long regId = 1; SQLiteDatabase db = datos.getWritableDatabase(); regId = db.insert(EstructuraDatos.TABLE_NAME, null, values); Uri newUri = ContentUris.withAppendedId(CONTENT_URI, regId); return newUri; } |
6.Se sobrescribe el método query()
, que permite consultar los datos almacenados. Este método devuelve un objeto Cursor con los datos solicitados al Content Provider:
CarteraClientes\src\com\academiaandroid\carteraclientes\BaseDatos.java
1.Se implementa una nueva clase llamada BaseDatos, que hereda de la clase base SQLiteOpenHelper, encargada de sobrescribir los métodos para la creación, actualización y consulta a una Base de Datos:
1 2 |
public class BaseDatos extends SQLiteOpenHelper{ |
2.Se sobrescriben los métodos onCreate()
y onUpgrade()
, encargados de recibir la consulta Transact-SQL para crear la Tabla, y actualización de dicha tabla:
1 2 3 4 5 6 7 8 9 10 11 12 |
@Override public void onCreate(SQLiteDatabase db) { db.execSQL(SQL_CREATE_ENTRIES); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(SQL_DELETE_ENTRIES); onCreate(db); } |
CarteraClientes\res\layout\activity_main.xml
- A nivel de layout (activity_main.xml), se añaden tres componentes de tipos EditText, que recogerán los datos introducidos por el usuario, para posteriormente enviarlos al pulsar el componente de tipo Button definido:
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455[...]<TableRowandroid:id="@+id/tableRow2"android:layout_width="wrap_content"android:layout_height="wrap_content" ><TextViewandroid:id="@+id/textView2"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/cliente" /><EditTextandroid:id="@+id/edCliente"android:layout_width="wrap_content"android:layout_height="wrap_content"android:inputType="textPersonName" ><requestFocus /></EditText></TableRow><TableRowandroid:id="@+id/tableRow5"android:layout_width="wrap_content"android:layout_height="wrap_content" ><Buttonandroid:id="@+id/btnGuardarRegistro"android:layout_width="wrap_content"android:layout_height="wrap_content"android:onClick="guardarDatos"android:text="@string/guardarRegistro" /><TextViewandroid:id="@+id/textView5"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/totalRegistros"android:textAppearance="?android:attr/textAppearanceLarge" /><TextViewandroid:id="@+id/txtTotalRegistros"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@color/azul"android:text="@string/campoVacio"android:textAppearance="?android:attr/textAppearanceLarge" /></TableRow>[...]
CarteraClientes\AndroidManifest.xml
- Por último, se debe definir dentro del AndroidManifest.xml, dentro de la etiqueta
<application>
, se añadirá el provider, como se muestra a continuación:
123456789101112<application>[...]<provider android:name="com.academiaandroid.carteraclientes.CompartirDatos"android:authorities="com.academiaandroid.carteraclientes.CompartirDatos"android:exported="true"android:multiprocess="true"/>[...]</application>
Descarga del código
DownloadEn el próximo tutorial veremos el 2º proyecto para acceder a los datos de este Content Provider que hemos creado.
Esta entrada tiene 2 comentarios
Los comentarios están cerrados.
[…] 4.Proyecto Android: Content Provider personalizado (I) […]
[…] 4.Proyecto Android: Content Provider personalizado (I) […]