Vamos a describir cómo configurar los ajustes antes de generar la versión del videojuego Unity que podrá ejecutarse…
SQLite: ejemplo de acceso a base de datos
2.
SQLite: ejemplo de acceso a base de datos
Proyecto realizado con API SQLite
Para el siguiente ejercicio que vamos a desarrollar, hemos utilizado la API SQLite para crear una Base de Datos llamada «Ferreteria», en la que se va a crear una tabla llamada «Ventas», que almacenarán una lista de artículos que se irán gestionando desde la pantalla principal de la aplicación Android.
Puedes descargarte el código del proyecto completo. Te agradeceríamos que a cambio, si te es posible, nos ayudaras a difundir este tutorial en alguna de las redes sociales cuyos iconos te aparecen a la izquierda. Gracias!
DownloadEstructura Base de Datos
Podemos ver en la imagen de abajo, la base de datos que vamos a utilizar en el ejemplo, con los campos de la tabla que vamos a crear:
En primer lugar crearemos un proyecto con el siguiente SDK:
1 2 3 4 5 6 7 |
[...] <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> [...] |
Tras crear el proyecto, se definen en nuestra Clase MainActivity los Controles necesarios para la lógica de la aplicación:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
[...] //Declaramos los controles necesarios para la lógica de la aplicación private EditText edProducto; private EditText edCantidad; private EditText edId; private Spinner spnSeccion; //Declaramos la clase encargada de crear y actualizar la Base de Datos MiBaseDatos basedatos; [...] [...] //Enlazamos los controles definidos con sus recursos a nivel de layout edProducto = (EditText)findViewById(R.id.edProducto); edCantidad = (EditText)findViewById(R.id.edCantidad); spnSeccion = (Spinner)findViewById(R.id.spinnerSeccion); edId = (EditText)findViewById(R.id.edIdentificador); //Creamos un Array de String con las secciones de una ferretería String[] secciones = {"Electricidad","Fontanería","Cerrajería","Jardinería","Tornillería","Vestimenta"}; spnSeccion.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, secciones)); [...] |
Además se han definido cuatro botones encargados de lanzar los eventos On Click para las operaciones CRUD (Create-Read-Update-Delete):
Ruta:StockFerreteria/com.academiaandroid.stockferreteria/MainActivity.java
En la imagen de abajo vemos la interfaz de nuestra aplicación, con los botones para realizar las operaciones CRUD:
Guardar un Registro:
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 |
[...] //Evento On Click para guardar un producto en la tabla Ventas public void guardarProducto(View view) { //Se inicializa la clase. basedatos = new MiBaseDatos(this); //Clase que permite llamar a los métodos para crear, eliminar, leer y actualizar registros. Se establecen permisos de escritura. SQLiteDatabase sqlite = basedatos.getWritableDatabase(); ContentValues content = new ContentValues(); [...] [...] //Se añaden los valores introducidos de cada campo mediante clave(columna)/valor(valor introducido en el campo de texto) content.put(Estructura.COLUMN_NAME_PRODUCTO,producto); content.put(Estructura.COLUMN_NAME_CANTIDAD, cantidad); content.put(Estructura.COLUMN_NAME_SECCION, seccion); sqlite.insert(Estructura.TABLE_NAME, null, content); [...] [...] //Se cierra la conexión abierta a la Base de Datos sqlite.close(); |
Buscar un Registro por ‘Producto’:
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 33 34 35 36 37 |
[...] //Evento On Click para buscar un producto en la tabla Ventas por nombre public void buscarProducto(View view) { basedatos = new MiBaseDatos(this); //Se establecen permisos de lectura SQLiteDatabase sqlite = basedatos.getReadableDatabase(); //Columnas que devolverá la consulta. String[] columnas = { Estructura._ID, Estructura.COLUMN_NAME_PRODUCTO, Estructura.COLUMN_NAME_CANTIDAD, Estructura.COLUMN_NAME_SECCION }; //Cláusula WHERE para buscar por producto String producto = Estructura.COLUMN_NAME_PRODUCTO + " LIKE '" + edProducto.getText().toString() + "'"; //Orden de los resultados devueltos por Producto, de forma Descendente alfabéticamente String ordenSalida = Estructura.COLUMN_NAME_PRODUCTO + "DESC"; [...] [...] //Ejecuta la sentencia devolviendo los resultados de los parámetros pasados de tabla, columnas, producto y orden de los resultados obtenidos. Cursor cursor = sqlite.query(Estructura.TABLE_NAME, columnas, producto,null, null, null, ordenSalida); [...] [...] //Se cierra la conexión abierta a la Base de Datos sqlite.close(); [...] |
Borrar Registro por nombre de Producto:
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 |
[...] //Evento On Click para eliminar un producto de la tabla Ventas por el nombre public void borrarProducto(View view) { //Se inicializa la clase. basedatos = new MiBaseDatos(this); //Se establecen permisos de escritura SQLiteDatabase sqlite = basedatos.getWritableDatabase(); [...] [...] //Se especifica en la cláusula WHERE el campo Producto y el producto introducido en el campo de texto a eliminar String consulta = Estructura.COLUMN_NAME_PRODUCTO + " LIKE '" + producto_eliminar + "'"; //Se borra el producto indicado en el campo de texto sqlite.delete(Estructura.TABLE_NAME, consulta, null); [...] [...] //Se cierra la conexión abierta a la Base de Datos sqlite.close(); [...] |
Modificar cualquier campo del registro:
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 33 34 35 36 37 38 39 40 |
[...] //Evento On Click para modificar un producto de la tabla Ventas. Todos los campos son modificables, excepto el campo _id public void modificarProducto(View view) { //Se inicializa la clase. basedatos = new MiBaseDatos(this); //Se establecen permisos de escritura SQLiteDatabase sqlite = basedatos.getWritableDatabase(); [...] [...] ContentValues content = new ContentValues(); //Se añaden los valores introducidos de cada campo mediante clave(columna)/valor(valor introducido en el campo de texto) content.put(Estructura.COLUMN_NAME_PRODUCTO, producto_modificar); content.put(Estructura.COLUMN_NAME_CANTIDAD, cantidad_modificar); content.put(Estructura.COLUMN_NAME_SECCION, seccion_modificar); [...] [...] //Se establece la condición del _id del producto a modificar String selection = Estructura._ID + " LIKE " + identificador; //Se llama al método update pasándole los parámetros para modificar el producto con el identificado como condición de busqueda int count = sqlite.update(Estructura.TABLE_NAME, content, selection, null); [...] [...] //Se cierra la conexión abierta a la Base de Datos sqlite.close(); [...] |
Dentro del Layout se definen los siguientes controles:
Ruta: StockFerreteria/com.academiaandroid.stockferreteria/MainActivity.java:
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 |
[...] <TextView android:id="@+id/textView5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Identificador:" /> <EditText android:id="@+id/edIdentificador" android:layout_width="match_parent" android:layout_height="wrap_content" /> <TextView android:id="@+id/txtProducto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="32dp" android:text="Producto:" /> <EditText android:id="@+id/edProducto" android:layout_width="wrap_content" android:layout_height="wrap_content" android:ems="10" > <requestFocus /> </EditText> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="34dp" android:text="Sección:" /> <Spinner android:id="@+id/spinnerSeccion" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="24dp" /> <TextView android:id="@+id/textView3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="35dp" android:text="Total:" /> <EditText android:id="@+id/edCantidad" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="56dp" android:ems="10" /> [...] [...] <Button android:id="@+id/btnGuardar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignTop="@+id/linearLayout1" android:onClick="guardarRegistro" android:text="Guardar" /> <Button android:id="@+id/btnEliminar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/btnGuardar" android:layout_below="@+id/btnGuardar" android:layout_marginTop="25dp" android:onClick="borrarProducto" android:text="Eliminar" /> <Button android:id="@+id/btnModificar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/btnEliminar" android:layout_below="@+id/btnEliminar" android:layout_marginTop="28dp" android:onClick="modificarProducto" android:text="Modificar" /> <Button android:id="@+id/btnBuscar" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/btnGuardar" android:layout_below="@+id/btnModificar" android:layout_marginTop="28dp" android:onClick="buscarProducto" android:text="Buscar" /> [...] |
En la imagen de abajo, vemos el Layout de la aplicación:
Como soporte para nuestra Activity principal se declaran dos clases:
- Una Clase Abstracta que implementa la interfaz BaseColumns, para establecer el nombre de la tabla, y los campos ‘producto’, ‘cantidad’ y ‘seccion’ definido como Constantes, ya que su valor no será modificado: Ruta: StockFerreteria/com.academiaandroid.stockferreteria/EstructuraDatos.java:
1 2 3 4 5 6 7 8 9 10 |
[...] public static abstract class Estructura implements BaseColumns { public static final String TABLE_NAME = "Ventas"; public static final String COLUMN_NAME_PRODUCTO = "producto"; public static final String COLUMN_NAME_CANTIDAD = "cantidad"; public static final String COLUMN_NAME_SECCION = "seccion"; } [...] |
- Y la Clase ‘MiBaseDatos‘, que hereda de la Clase ‘SQLiteOpenHelper’, que implementará los métodos OnCreate() y OnUpgrade() encargados de crear y actualizar la Base de Datos:
Ruta: StockFerreteria/com.academiaandroid.stockferreteria/MiBaseDatos.java:
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 33 34 35 36 37 |
[...] public class MiBaseDatos extends SQLiteOpenHelper{ //Se declaran e inicializan las variables encargadas de almacenar las consultas para crear la tabla 'Ventas', //y las consultas de eliminar/crear la Base de Datos 'Ferreteria.sqlite'. private static final String TEXT_TYPE = " TEXT"; private static final String COMMA_SEP = ","; private static final String SQL_CREATE_ENTRIES = "CREATE TABLE " + Estructura.TABLE_NAME + " (" + Estructura._ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + Estructura.COLUMN_NAME_PRODUCTO + TEXT_TYPE + COMMA_SEP + Estructura.COLUMN_NAME_CANTIDAD + TEXT_TYPE + COMMA_SEP + Estructura.COLUMN_NAME_SECCION + TEXT_TYPE + " )"; private static final String SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS " + Estructura.TABLE_NAME; public static final int DATABASE_VERSION = 1; public static final String DATABASE_NAME = "Ferreteria.sqlite"; [...] [...] //Método para crear la Tabla que recibe la consulta Transact-SQL @Override public void onCreate(SQLiteDatabase db) { db.execSQL(SQL_CREATE_ENTRIES); } //Método que elimina la tabla y vuelve a llamar al método que la crea @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL(SQL_DELETE_ENTRIES); onCreate(db); } [...] |
Esta entrada tiene 19 comentarios
Los comentarios están cerrados.
Aunque le dé permisos ya no me deja descargar el proyecto!
Discúlpanos Josué pero se había quedado sin contestar tu comentario.
En principio, no nos están comentando ningún problema los usuarios, y hay descargas más o menos continuas de este proyecto. ¿Te sigue ocurriendo? En caso de que sí, ¿te sale algún tipo de mensaje o error?.
Saludos
Puedes mandarme el proyecto a mi corre porfa! ya que no puedo descargarlo
Hola Josue,
vamos a cambiar el modo de descargarlo. Debe estar solucionado en una media hora.
Saludos
Hola Muchas gracias por la informaciòn, tengo la siguiente duda, me gustaría que al seleccionar el checkbox se vea en una base de datos, como lo puedo hacer, gracias.
Hola Mario, disculpa pero no entendemos bien tu pregunta.
En cualquier caso, a cuestiones de este tipo, podemos dar soporte en nuestro curso de Aplicaciones Android con bbdd SQLite donde contáis con la ayuda de un tutor especializado.
Gracias
Hola por favor me podrian mandar a mi correo, no lo puedo descargar. Porfavor Gracias.
Hola Ricardo, hemos comprobado con varios navegadores (Chrome y Firefox) que la descarga funciona bien. ¿Puedes reintentarlo por si ha sido algo puntual?
Si te falla nuevamente ¿nos puedes decir qué error te da?
Gracias
disculpa si en ves de hacerlo con los spinner lo quiero hacer con radiobutton y checkbox como lo podria hacer para guardarlos en la base de datos y luego recuperarlos ???
Perdona Rubén pero había quedado el mensaje en el filtro spam.Esperamos que hayas resuelto ya tu duda entretanto.
A través de estos comentarios intentamos atender incidencias que podáis encontrar en nuestros contenidos (problemas para descargar algún proyecto, errores que podáis detectar en algún tutorial…) y por supuesto escuchar vuestras sugerencias.
Para cuestiones de soporte, os rogamos consultéis los cursos online que tenemos disponibles, como el de bbdd Sqlite donde contáis un tutor os va a prestar toda la ayuda necesaria.
Gracias
Una consulta, esta base de datos donde se guarda. Me gustaria sacar una copia de la misma y guardarla en una nube como dropbox. Gracias de antemano
Hola Rodrigo, en la anterior publicación de esta misma serie (http://academiaandroid.com/sqlite-introduccion-herramientas-administracion/) tienes una serie de herramientas de administración que puedes utilizar para exportar los registros y guardarlos en otros sitios como dropbox.
Saludos
Que tal, una consulta. Como puedo hacer para cargar en un spinner como si fuese un combobox el displaymember (descripción de un producto) y valuemember (id del producto) y guardar el id en una tabla que llamamos ventas. Luego al realizar la consulta de la venta se cargue en el spinner el producto que se guardo.
Joseph, en los tutoriales que estamos publicando sobre SQLite (de nuestro curso de Programación de Apps con Android Studio: http://www.digitallearning.es/curso-android-desarrollo-aplicaciones.html) desarrollamos un ejemplo de App con un formulario con registro/consulta y eliminación de registros en una bbdd Sqlite, que utiliza un spinner y quizás puede ayudarte:
http://academiaandroid.com/proyecto-ejemplo-de-app-android-con-bbdd-sqlite/
Saludos
Hola, no puedo descargar el codigo para seguir el ejemplo paso a paso, me lo podeis mandar al mail o resubir la descarga? Gracias por adelantado y fantastico trabajo
Hola Rubén,
te hemos contestado al email que enviastes. En principio debe ya funcionar la descarga según la prueba que hemos hecho. Si no, contacta por favor con nosotros.
Gracias
Hola, muy bueno el aporte, pero queria saber como puedo hacer para importar datos a la base de datos sqlite, y seguir las operaciones en android
Estimados, una consulta.
Bajo ese mismo codigo que esta muy bueno por cierto como podríamos hacer para agregar un ListView y que se pueda mostrar los datos de PRODUCTO y CANTIDAD de la base de datos, tipo para consultas manuales de la base y no por el programa como tal, un ListView donde se vea la base sin hacer clic ni nada solo que se muestre ni bien se ejecuta el programa.
Gracias.
Hola Andy, gracias por tu comentario.
Para plantear cuestiones o dudas podemos ofrecerte nuestros cursos online (https://android.digitallearning.es/cursos-formacion/), por ejemplo el curso de SQLite, donde hay un Tutor que te ayuda y asesora con cualquier pregunta relacionada con la materia.
Esta web, Academia Android, solo está dedicada a la publicación de contenidos para autoformación y no contamos con ese tipo de soporte.
Un saludo