Crearemos una aplicación que permita gestionar los libros almacenados en la base de datos SQLite.
La aplicación mostrará los libros almacenados, permitirá añadir más libros y también podrá filtrarlos según el género.
En este tutorial aprenderás a:
- Realizar operaciones básicas sobre la base de datos SQLite
- Usar un ContentProvider para manejar las bases de datos
Espero que os guste y os resulta fácil. No dude en comentar.
¡ Saludos !
Enlaces de interés
Puede descargar si lo desea el código fuente de este proyecto.
Pasos a seguir:
1. Creamos la actividad principal que en este caso es un menú en donde el usuario podrá escoger entre añadir un nuevo libro, listarlo o filtrarlo.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MenuActivity" > <LinearLayout android:id="@+id/linearLayout1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:orientation="vertical" > <Button android:id="@+id/btnAnadir" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/anadir" /> <Button android:id="@+id/btnListar" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/listar" /> <Button android:id="@+id/btnFiltrar" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/filtrar" /> </LinearLayout> <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_above="@+id/linearLayout1" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:layout_marginBottom="58dp" android:gravity="center" android:text="@string/que_desea_hacer" android:textAppearance="?android:attr/textAppearanceLarge" /> </RelativeLayout>
2. Creamos otra actividad que permita al usuario añadir un nuevo libro a la base de datos.
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/ScrollView1" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".AnadirActivity" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/asignatura" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/edtxtAsignatura" android:layout_width="match_parent" android:layout_height="wrap_content" > <requestFocus /> </EditText> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/titulo" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/edtxtTitulo" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/autor" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/edtxtAutor" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/editorial" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/edtxtEditorial" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/genero" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/edtxtGenero" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/textView6" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/fecha_publicacion" android:textAppearance="?android:attr/textAppearanceLarge" /> <EditText android:id="@+id/edtxtFecha" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btnGuardar" android:layout_width="320dp" android:layout_height="wrap_content" android:layout_gravity="right" android:text="@string/guardar" /> </LinearLayout> </ScrollView>
3. Creamos un nuevo layout que será en donde se mostrará cada libro obtenido.
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentRight="true" android:background="@drawable/fondo" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="10dp" android:background="@drawable/contenido" android:orientation="vertical" > <TextView android:id="@+id/TextView10" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/asignatura" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtAsignatura" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="10dp" android:background="@drawable/contenido" android:orientation="vertical" > <TextView android:id="@+id/TextView08" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/titulo" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtTitulo" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="10dp" android:background="@drawable/contenido" android:orientation="vertical" > <TextView android:id="@+id/TextView06" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/autor" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtAutor" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="10dp" android:background="@drawable/contenido" android:orientation="vertical" > <TextView android:id="@+id/TextView04" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/editorial" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtEditorial" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="10dp" android:background="@drawable/contenido" android:orientation="vertical" > <TextView android:id="@+id/TextView02" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/genero" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtGenero" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginBottom="10dp" android:background="@drawable/contenido" android:orientation="vertical" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/fecha_publicacion" android:textAppearance="?android:attr/textAppearanceLarge" /> <TextView android:id="@+id/txtFecha" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="right" android:text="Large Text" android:textAppearance="?android:attr/textAppearanceLarge" /> </LinearLayout> </LinearLayout> </RelativeLayout>
4. Creamos la actividad en donde permitiremos al usuario filtrar los libros por género y le mostraremos los libros filtrados.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".FiltrarActivity" > <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="vertical" > <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" > <EditText android:id="@+id/edtxtFiltrarGenero" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:hint="@string/genero_filtrar" > <requestFocus /> </EditText> <Button android:id="@+id/btnFiltrarGenero" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/filtrar" /> </LinearLayout> <ListView android:id="@+id/listvFiltrado" android:layout_width="match_parent" android:layout_height="wrap_content" > </ListView> </LinearLayout> </RelativeLayout>
5. Creamos la clase que va a gestionar la base de datos y que heredará de ContentProvider para ello definimos los campos que nos van a hacer falta.
/** * Clase que gestiona la base de datos * * @author José Miguel Acosta Martín * */ public class Biblioteca_Content extends ContentProvider { ////////////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Configuración de la base de datos public static final String DATABASE_NAME = "biblioteca.db"; private static final int DATABASE_VERSION = 1; private static final String DATABASE_TABLE = "libros"; // Columnas de la tabla "libros" public static final String[] TABLE_COLUMNS = { LibrosColumns._ID, LibrosColumns.KEY_ASIGNATURA, LibrosColumns.KEY_TITULO, LibrosColumns.KEY_AUTOR, LibrosColumns.KEY_EDITORIAL, LibrosColumns.KEY_GENERO, LibrosColumns.KEY_FECHA }; // Sentencia para crear la base de datos public static final String CREATE_TABLE = "create table " + DATABASE_TABLE + " (" + LibrosColumns._ID + " integer primary key autoincrement, " + LibrosColumns.KEY_ASIGNATURA + " text not null, " + LibrosColumns.KEY_TITULO + " text not null, " + LibrosColumns.KEY_AUTOR + " text not null, " + LibrosColumns.KEY_EDITORIAL + " text not null, " + LibrosColumns.KEY_GENERO + " text not null, " + LibrosColumns.KEY_FECHA + " text not null" + ");"; // Configuración del Uri/Content_Uri public static final String AUTHORITY = "com.acdat.biblioteca"; public static final String BASE_PATH = "libros"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + BASE_PATH); public static final int TABLE = 0; public static final int TABLE_ROW = 1; public static final UriMatcher uriMatcher; static{ uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); uriMatcher.addURI(AUTHORITY, BASE_PATH, TABLE); uriMatcher.addURI(AUTHORITY, BASE_PATH + "/#", TABLE_ROW); } private SQLiteDatabase sqldb; // La base de datos private DatabaseOpenHelper databaseOpenHelper; // Clase que gestiona la creación de la base de datos ////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // //////////////////////////////////////////////////////////////////////////////////////////////////////
6. Crearemos una clase interna a la anterior clase que contendrá las columnas de la tabla de la base de datos.
/** * Clase que define la estructura de la tabla "libros" * * @author José Miguel Acosta Martín * */ public static class LibrosColumns implements BaseColumns{ // Define las columnas de la tabla "libros" public static final String KEY_ASIGNATURA = "asignatura"; public static final String KEY_TITULO = "titulo"; public static final String KEY_AUTOR = "autor"; public static final String KEY_EDITORIAL = "editorial"; public static final String KEY_GENERO = "genero"; public static final String KEY_FECHA = "fecha"; }
/** * Gestioa la creación y eliminación de la base de datos * * @author José Miguel Acosta Martín * */ private class DatabaseOpenHelper extends SQLiteOpenHelper{ public DatabaseOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { // Crea la base de datos db.execSQL(CREATE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Borra la base de datos si existe db.execSQL("drop table if exists " + DATABASE_TABLE); onCreate(db); } }
8. En el método onCreate() inicializamos los campos necesarios.
@Override public boolean onCreate() { databaseOpenHelper = new DatabaseOpenHelper(getContext()); return true; }
9. Creamos el método insertar que nos permitirá insertar un nuevo libro.
/** * Inserta un libro en la base de datos */ @Override public Uri insert(Uri uri, ContentValues values) { // CAMPOS //////////////////////////////////////////////////////////////////////////// long id; // Almacena el id de la fila insertada (-1 en caso contrario) Uri uriTmp; // Almacena la uri temporal que devuelve // FIN CAMPOS ///////////////////////////////////////////////////////////////////////// // EJECUCIÓN /////////////////////////////////////////////////////////////////////////// // Abre la base de datos en modo escritura sqldb = databaseOpenHelper.getWritableDatabase(); // Inserta y obtiene el id id = sqldb.insert(DATABASE_TABLE, null, values); // Obtiene la uri correspondiente al id uriTmp = ContentUris.withAppendedId(CONTENT_URI, id); return uriTmp; // FIN EJECUCIÓN //////////////////////////////////////////////////////////////////////// }
10. Creamos el método que nos permite obtener el cursor de todos los libros.
@Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // CAMPOS ////////////////////////////////////////////////////////////////////////////////////// String where; // Almacena la sentencia where Cursor cursor; // Almacena el cursor // FIN CAMPOS ////////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN //////////////////////////////////////////////////////////////////////////////////// // Abre la base de datos en modo lectura sqldb = databaseOpenHelper.getReadableDatabase(); // Obtiene la sentencia where where = selection; // Controla si se desea filtrado if (uriMatcher.match(uri) == TABLE_ROW){ // SIn filtrado ... // Forma la sentencia where where = "_id=" + uri.getLastPathSegment(); // Obtiene le cursor cursor = sqldb.query(DATABASE_TABLE, TABLE_COLUMNS, where, null, null, null, null); return cursor; } else{ // Con filtrado ... // Obtiene el cursor cursor = sqldb.query(DATABASE_TABLE, TABLE_COLUMNS, selection, selectionArgs, null, null, null); return cursor; } // FIN EJECUCIÓN //////////////////////////////////////////////////////////////////////////////// }
11. Una vez que tenemos la clase que maneja la base de datos podemos seguir programando el resto de la aplicación, para la actividad que contiene el menú simplemente declaramos los campos y declaramos los eventos de los botones.
package com.ACDAT.ejercicio1; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; /** * Muestra las opciones principales de la aplicación * * @author José Miguel Acosta Martín * */ public class MenuActivity extends Activity { ////////////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private Button btnAnadir; // Componente que permite al usuario añadir un libro private Button btnListar; // Componente que permite al usuario listar los libros private Button btnFiltar; // Componente que permite al usuario filtrar los libros ////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// // MÉTODOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu); // INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////////// btnAnadir = (Button) findViewById(R.id.btnAnadir); btnListar = (Button) findViewById(R.id.btnListar); btnFiltar = (Button) findViewById(R.id.btnFiltrar); // FIN INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// // EVENTOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Añade libros a la base de datos btnAnadir.setOnClickListener(new OnClickListener() { /** * Añade libro a la base de datos */ @Override public void onClick(View v) { // CAMPOS //////////////////////////////////////////////////////////////////////////////////// Intent intent; // FIN CAMPOS //////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN ////////////////////////////////////////////////////////////////////////////////// // Inicia la actividad intent = new Intent(MenuActivity.this, AnadirActivity.class); startActivity(intent); // FIN EJECUCIÓN ////////////////////////////////////////////////////////////////////////////// } }); // Lista los libros de la base de datos btnListar.setOnClickListener(new OnClickListener() { /** * Lista los libros de la base de datos */ @Override public void onClick(View v) { // CAMPOS ////////////////////////////////////////////////////////////////////////////////////// Intent intent; // FIN CAMPOS ////////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN /////////////////////////////////////////////////////////////////////////////////// // Inicia la actividad intent = new Intent(MenuActivity.this, ListarLibrosActivity.class); startActivity(intent); // FIN EJECUCIÓN ////////////////////////////////////////////////////////////////////////////// } }); // Filtra los libros de la base de datos btnFiltar.setOnClickListener(new OnClickListener() { /** * Filtra los libros de la base de datos */ @Override public void onClick(View v) { // CAMPOS //////////////////////////////////////////////////////////////////////////////////// Intent intent; // FIN CAMPOS //////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN ///////////////////////////////////////////////////////////////////////////////// // Inicia la actividad intent = new Intent(MenuActivity.this, FiltrarActivity.class); startActivity(intent); // FIN EJECUCIÓN ///////////////////////////////////////////////////////////////////////////// } }); ////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN EVENTOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// } ////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN MÉTODOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// }
12. En la actividad listar tendremos que declarar los campos y mostrar a través de la clase que gestiona la base de datos todos los libros.
package com.ACDAT.ejercicio1; import com.ACDAT.ejercicio1.Biblioteca_Content.LibrosColumns; import android.app.ListActivity; import android.content.Context; import android.database.Cursor; import android.os.Bundle; import android.support.v4.widget.SimpleCursorAdapter; import android.widget.ListView; /** * Lista todos los libros de la base de datos * * @author José Miguel Acosta Martín * */ public class ListarLibrosActivity extends ListActivity{ ////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////// private SimpleCursorAdapter simpleCursorAdapter; // Adaptador del cursor private int campos[] = { R.id.txtAsignatura, R.id.txtTitulo, R.id.txtAutor, R.id.txtEditorial, R.id.txtGenero, R.id.txtFecha }; // Almacena los identificadores de los campos donde se va a mostrar los datos private String[] columnas = { LibrosColumns.KEY_ASIGNATURA, LibrosColumns.KEY_TITULO, LibrosColumns.KEY_AUTOR, LibrosColumns.KEY_EDITORIAL, LibrosColumns.KEY_GENERO, LibrosColumns.KEY_FECHA }; // Almacena las columnas que queremos mostrar private Cursor cursor; // Almacena el cursor ////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////// // MÉTODOS // ////////////////////////////////////////////////////////////////////////////////////////// @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // EJECUCIÓN ////////////////////////////////////////////////////////////////////////////// // Obtiene el cursor con los datos cursor = getContentResolver().query(Biblioteca_Content.CONTENT_URI, columnas, null, null, null); // Crea el adaptador simpleCursorAdapter = new SimpleCursorAdapter(ListarLibrosActivity.this, R.layout.libro_item, cursor, columnas, campos, 0); // Establece el adaptador setListAdapter(simpleCursorAdapter); // FIN EJECUCIÓN ///////////////////////////////////////////////////////////////////////////// } ////////////////////////////////////////////////////////////////////////////////////////// // FIN MÉTODOS // ////////////////////////////////////////////////////////////////////////////////////////// }
13. Para la actividad añadir hacemos lo mismo, declaramos los campos necesarios y obtenemos a través de ellos los datos introducidos por el usuario, luego a través de la clase que gestiona la base de datos añadimos el nuevo libro.
package com.ACDAT.ejercicio1; import android.app.Activity; import android.content.ContentValues; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.Toast; /** * Permite al usuario añadir un nuevo libro a la base de datos * * @author José Miguel Acosta Martín * */ public class AnadirActivity extends Activity { ////////////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private EditText edtxtAsignatura; // Campo gráfico que permite al usuario introducir la asignatura private EditText edtxtTitulo; // Campo gráfico que permite al usuario introducir el titulo private EditText edtxtAutor; // Campo gráfico que permite al usuario introducir el autor private EditText edtxtEditorial; // Campo gráfico que permite al usuario introducir la editorial private EditText edtxtGenero; // Camoo gráfico que permite al usuario introducir el género private EditText edtxtFecha; // Campo gráfico que permite al usuario introducir la fecha private Button btnGuardar; // Componente gráfico que permite al usuario guardar el libro ////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// // MÉTODOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_anadir); // INICIALIZACIÓN DE CAMPOS ////////////////////////////////////////////////////////////////////// edtxtAsignatura = (EditText) findViewById(R.id.edtxtAsignatura); edtxtTitulo = (EditText) findViewById(R.id.edtxtTitulo); edtxtAutor = (EditText) findViewById(R.id.edtxtAutor); edtxtEditorial = (EditText) findViewById(R.id.edtxtEditorial); edtxtGenero = (EditText) findViewById(R.id.edtxtGenero); edtxtFecha = (EditText) findViewById(R.id.edtxtFecha); btnGuardar = (Button) findViewById(R.id.btnGuardar); // FIN INICIALIZACIÓN DE CAMPOS ////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// // EVENTOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Guarda el libro en la base de datos btnGuardar.setOnClickListener(new OnClickListener() { /** * Guarda el libro en la base de datos */ @Override public void onClick(View v) { // CAMPOS //////////////////////////////////////////////////////////////////////////////////// String asignatura; String titulo; String autor; String editorial; String genero; String fecha; ContentValues contentValues; // Almacena los datos introducidos por el usuario // FIN CAMPOS //////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN ///////////////////////////////////////////////////////////////////////////////// // Inicialización de campos ------------------------------------------------------------------// // Recoge los datos introducidos por el usuario asignatura = edtxtAsignatura.getText().toString(); titulo = edtxtTitulo.getText().toString(); autor = edtxtAutor.getText().toString(); editorial = edtxtEditorial.getText().toString(); genero = edtxtGenero.getText().toString(); fecha = edtxtFecha.getText().toString(); contentValues = new ContentValues(); Uri uriTmp; // Almace la uri de respuesta al insertar // FIN Inicialización de campos --------------------------------------------------------------// // Almacena los datos introducidos por el usuario contentValues.put(Biblioteca_Content.LibrosColumns.KEY_ASIGNATURA, asignatura); contentValues.put(Biblioteca_Content.LibrosColumns.KEY_TITULO, titulo); contentValues.put(Biblioteca_Content.LibrosColumns.KEY_AUTOR, autor); contentValues.put(Biblioteca_Content.LibrosColumns.KEY_EDITORIAL, editorial); contentValues.put(Biblioteca_Content.LibrosColumns.KEY_GENERO, genero); contentValues.put(Biblioteca_Content.LibrosColumns.KEY_FECHA, fecha); // Crea la base de datos en caso de que no exista getContentResolver().query(Biblioteca_Content.CONTENT_URI, Biblioteca_Content.TABLE_COLUMNS, null, null, null); // Obtiene la uri uriTmp = getContentResolver().insert(Biblioteca_Content.CONTENT_URI, contentValues); // Comprueba si se ha podido añadir if (uriTmp.getLastPathSegment().equals("-1")){ // Si no se ha podido añadir ... // Informa al usuario Toast.makeText(AnadirActivity.this, getResources().getString(R.string.error_al_guardar), Toast.LENGTH_LONG).show(); } else{ // Si se ha podido añadir ... // Informa al usuario Toast.makeText(AnadirActivity.this, getResources().getString(R.string.libro_guardado, titulo), Toast.LENGTH_LONG).show(); } // FIN EJECUCIÓN ////////////////////////////////////////////////////////////////////////////// } }); ////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN EVENTOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// } ////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN MÉTODOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// }
14. Ya para terminar solo nos queda filtrar, tendremos que declarar los campos y a través de la clase que gestiona la base de datos nos ayudamos para obtener el filtrado.
package com.ACDAT.ejercicio1; import android.app.Activity; import android.database.Cursor; import android.os.Bundle; import android.support.v4.widget.SimpleCursorAdapter; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.ListView; import com.ACDAT.ejercicio1.Biblioteca_Content.LibrosColumns; /** * Filtra los datos de la base de datos * * @author José Miguel Acosta Martín * */ public class FiltrarActivity extends Activity { ////////////////////////////////////////////////////////////////////////////////////////////////////// // CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Campos gráficos private EditText edtxtGenero; // Campo gráfico donde el usuario introduce el género por el que filtrar private Button btnFiltrar; // Componente gráfico que permite al usuario filtrar private ListView lstvFiltrado; // Componente gráfico donde se muestran los datos // Otros camos private int[] campos = { R.id.txtAsignatura, R.id.txtTitulo, R.id.txtAutor, R.id.txtEditorial, R.id.txtGenero, R.id.txtFecha }; // Almacena los identificadores de los campos donde se va a mostrar los datos private String[] columnas = { LibrosColumns.KEY_ASIGNATURA, LibrosColumns.KEY_TITULO, LibrosColumns.KEY_AUTOR, LibrosColumns.KEY_EDITORIAL, LibrosColumns.KEY_GENERO, LibrosColumns.KEY_FECHA }; // Almacena las columnas que queremos mostrar private SimpleCursorAdapter simpleCursorAdapter; // Adaptador del cursor private Cursor cursor; // Cursor desde el que vamos a obtener los datos static final String selection = LibrosColumns.KEY_GENERO + "=?"; // Almacena la opcion de filtrado ////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN CAMPOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// // MÉTODOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_filtrar); // INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////////// // Campos gráficos edtxtGenero = (EditText) findViewById(R.id.edtxtFiltrarGenero); btnFiltrar = (Button) findViewById(R.id.btnFiltrarGenero); lstvFiltrado = (ListView) findViewById(R.id.listvFiltrado); // FIN INICIALIZACIÓN DE CAMPOS ///////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////////////////////////// // EVENTOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// // Filtra los datos btnFiltrar.setOnClickListener(new OnClickListener() { /** * Filtra los datos */ @SuppressWarnings("deprecation") @Override public void onClick(View v) { // CAMPOS //////////////////////////////////////////////////////////////////////////////////////// String[] selectionArgs; // Almacena el nombre por el que filtrar // FIN CAMPOS //////////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN ////////////////////////////////////////////////////////////////////////////////////// // Obtiene el nombre de filtrado selectionArgs = new String[] {edtxtGenero.getText().toString()}; // Obtiene los datos filtrados cursor = getContentResolver().query(Biblioteca_Content.CONTENT_URI, columnas, selection, selectionArgs, null); // Crea un nuevo adapter con los datos filtrados simpleCursorAdapter = new SimpleCursorAdapter(FiltrarActivity.this, R.layout.libro_item, cursor, columnas, campos, 0); // Establece el adaptador lstvFiltrado.setAdapter(simpleCursorAdapter); // FIN EJECUCIÓN /////////////////////////////////////////////////////////////////////////////////// } }); ////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN EVENTOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// // EJECUCIÓN ///////////////////////////////////////////////////////////////////////////////////////// // Obtiene los datos de la base de datos cursor = getContentResolver().query(Biblioteca_Content.CONTENT_URI, columnas, null, null , null); // Crea el cursor con los datos simpleCursorAdapter = new SimpleCursorAdapter(FiltrarActivity.this, R.layout.libro_item, cursor, columnas, campos, 0); // Establece el adaptador lstvFiltrado.setAdapter(simpleCursorAdapter); // FIN EJECUCIÓN ////////////////////////////////////////////////////////////////////////////////////// } ////////////////////////////////////////////////////////////////////////////////////////////////////// // FIN MÉTODOS // ////////////////////////////////////////////////////////////////////////////////////////////////////// }
FIN
Está muy bien y lo estaba buscando, pero ..¿Cómo lo hago ejecutar como una aplicación?.
ResponderEliminarImporta el proyecto en eclipse, abra el proyecto y pulse sobre el icono play que se encuentra en la parte superior de la aplicación, le saldrá una nueva ventana en la que se le pregunta sobre como quiere que se ejecute, seleccione como aplicación y directamente arrancará el emulador de Android con la aplicación.
ResponderEliminarEn este tutorial perteneciente a "eslomas.com" te dice de una forma sencilla como ejecutar también una aplicación Android importada en Eclipse.
Aquí tienes el enlace: http://www.eslomas.com/2010/08/primera-aplicacion-con-android-hola-mundo/
De todas formas, si quieres probarlo en el móvil, en el mismo código fuente, en la carpeta bin, se encuentra el archivo Ejercicio1.apk, con el que podrás instalarlo directamente en tú móvil.
Si necesitas más información o lo que sea, no dudes en preguntarme, un saludo!
Disculpa no sé mucho de esto, estoy haciendo un proyecto escolar, y me interesa la aplicación, pero, no sé a qué te refieres con "Crear un Layout" en el paso 3, ¿Dónde lo creo? al igual que lo de crear las clases y subclases, ésas van el la carpeta Src? o en dónde?
ResponderEliminarPor favor, me ayudarías muchísimo. Gracias
Muy buenas.
EliminarNo es exactamente así pero quizás lo entiendas mejor, un activity es en una clase junto con su vista, están enlazados automáticamente, en cambio un layout es igual que la activity pero sin la clase, por lo que en muchos casos se suele crear una clase para utilizar el layout, a igual que una acitivity, esto sería crear una activity de forma manual, lo que pasa que en este caso le estamos dando un diseño a una lista, para que cada item (fila de la lista) se muestre de una forma personalizada, para ello necesitamos este layout.
Para crear un layout en eclipse sería: "Ir a Archivo - Nuevo - otro - Android - android XML Layout"
Si tienes cualquier problema no dudes en comentármelo.
Un saludo.
Hola, tengo una duda, me marca error en esta linea:
ResponderEliminarToast.makeText(AñadirActivity.this, getResources().getString(R.string.error_al_guardar), Toast.LENGTH_LONG).show()
En la parte de "error al guardar", igual en la linea que sigue de "libro guardado", ¿Qué hago? o ¿por qué me sale eso?, por favor y Gracias.
Muy buenas.
EliminarEn principio la aplicación subida está libre de errores, pero como cada ordenador es un mundo y somos humanos siempre puede haber un error que se nos escape.
Para ayudarte necesito que me especifiques si es un error de compilación, antes de lanzar la aplicación, o un error de ejecución, una vez lanzada la aplicación es cuando sale el error.
De todas formas intentaré echarle un vistazo a ver que te puede estar pasando.
Un saludo.
Hola José Miguel, ante todo quiero felicitarte por el ejemplo que cubre todas las necesidades, para trabajar con una Base de Datos.
ResponderEliminarPero tengo un problema y no se por donde puedo solucionarlo, al ejecutar el proyecto no da error:
Pero si pinchas por ejemplo Filtrar te da este error:
ActivityThread Failed to find provider info for com,acdat.biblioteca
El mismo error da cunado pinchas Listar
Pero cuando pinchar Guardar en la actividad Añadir, te da el mismo
y un montón más que me supongo que serán consecuencia del primer error.
desde ya agradezco tu ayuda y te envío un gran saludo