Bases de Datos en Android (I): Primeros pasos

En los siguientes artículos de este tutorial de programación Android, nos vamos a detener en describir las distintas opciones de acceso a datos que proporciona la plataforma y en cómo podemos realizar las tareas más habituales dentro de este apartado.

La plataforma Android proporciona dos herramientas pricipales para el almacenamiento y consulta de datos estructurados:

  • Bases de Datos SQLite
  • Content Providers

En estos próximos artículos nos centraremos en la primera opción, SQLite, que abarcará todas las tareas relacionadas con el almacenamiento de los datos propios de nuestra aplicación. El segundo de los mecanismos, los Content Providers, que trataremos más adelante, nos facilitarán la tarea de hacer visibles esos datos a otras aplicaciones y, de forma recíproca, de permitir la consulta de datos publicados por terceros desde nuestra aplicación.

SQLite es un motor de bases de datos muy popular en la actualidad por ofrecer características tan interesantes como su pequeño tamaño, no necesitar servidor, precisar poca configuración, ser transaccional y por supuesto ser de código libre.

Android incorpora de serie todas las herramientas necesarias para la creación y gestión de bases de datos SQLite, y entre ellas una completa API para llevar a cabo de manera sencilla todas las tareas necesarias. Sin embargo, en este primer artículo sobre bases de datos en Android no vamos a entrar en mucho detalle con esta API. Por el momento nos limitaremos a ver el código necesario para crear una base de datos, insertaremos algún dato de prueba, y veremos cómo podemos comprobar que todo funciona correctamente.

En Android, la forma típica para crear, actualizar, y conectar con una base de datos SQLite será a través de una clase auxiliar llamada SQLiteOpenHelper, o para ser más exactos, de una clase propia que derive de ella y que debemos personalizar para adaptarnos a las necesidades concretas de nuestra aplicación.

La clase SQLiteOpenHelper tiene tan sólo un constructor, que normalmente no necesitaremos sobrescribir, y dos métodos abstractos, onCreate() y onUpgrade(), que deberemos personalizar con el código necesario para crear nuestra base de datos y para actualizar su estructura respectivamente.

Como ejemplo, nosotros vamos a crear una base de datos muy sencilla llamada BDUsuarios, con una sóla tabla llamada Usuarios que contendrá sólo dos campos: nombre e email. Para ellos, vamos a crear una clase derivada de SQLiteOpenHelper que llamaremos UsuariosSQLiteHelper, donde sobrescribiremos los métodos onCreate() y onUpgrade() para adaptarlos a la estructura de datos indicada:

package net.sgoliver.android.bd;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class UsuariosSQLiteHelper extends SQLiteOpenHelper {

	//Sentencia SQL para crear la tabla de Usuarios
	String sqlCreate = "CREATE TABLE Usuarios (codigo INTEGER, nombre TEXT)";

	public UsuariosSQLiteHelper(Context contexto, String nombre,
                               CursorFactory factory, int version) {
		super(contexto, nombre, factory, version);
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		//Se ejecuta la sentencia SQL de creación de la tabla
		db.execSQL(sqlCreate);
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int versionAnterior, int versionNueva) {
		//NOTA: Por simplicidad del ejemplo aquí utilizamos directamente la opción de
		//      eliminar la tabla anterior y crearla de nuevo vacía con el nuevo formato.
		//      Sin embargo lo normal será que haya que migrar datos de la tabla antigua
		//      a la nueva, por lo que este método debería ser más elaborado.

		//Se elimina la versión anterior de la tabla
		db.execSQL("DROP TABLE IF EXISTS Usuarios");

		//Se crea la nueva versión de la tabla
		db.execSQL(sqlCreate);
	}
}

Lo primero que hacemos es definir una variable llamado sqlCreate donde almacenamos la sentencia SQL para crear una tabla llamada Usuarios con los campos alfanuméricos nombre e email. NOTA: No es objetivo de este tutorial describir la sintaxis del lenguaje SQL ni las particularidades del motor de base de datos SQLite, por lo que no entraré a describir las sentencias SQL utilizadas. Para más información sobre SQLite puedes consultar la documentación oficial o empezar por leer una pequeña introducción que hice en este mismo blog cuando traté el tema de utilizar SQLite desde aplicaciones .NET

El método onCreate() será ejecutado automáticamente por nuestra clase UsuariosDBHelper cuando sea necesaria la creación de la base de datos, es decir, cuando aún no exista. Las tareas típicas que deben hacerse en este método serán la creación de todas las tablas necesarias y la inserción de los datos iniciales si son necesarios. En nuestro caso, sólo vamos a crear la tabla Usuarios descrita anteriomente. Para la creación de la tabla utilizaremos la sentencia SQL ya definida y la ejecutaremos contra la base de datos utilizando el método más sencillo de los disponibles en la API de SQLite proporcionada por Android, llamado execSQL(). Este método se limita a ejecutar directamente el código SQL que le pasemos como parámetro.

Por su parte, el método onUpgrade() se lanzará automáticamente cuando sea necesaria una actualización de la estructura de la base de datos o una conversión de los datos. Un ejemplo práctico: imaginemos que publicamos una aplicación que utiliza una tabla con los campos usuario e email (llamémoslo versión 1 de la base de datos). Más adelante, ampliamos la funcionalidad de nuestra aplicación y necesitamos que la tabla también incluya un campo adicional como por ejemplo con la edad del usuario (versión 2 de nuestra base de datos). Pues bien, para que todo funcione correctamente, la primera vez que ejecutemos la versión ampliada de la aplicación necesitaremos modificar la estructura de la tabla Usuarios para añadir el nuevo campo edad. Pues este tipo de cosas son las que se encargará de hacer automáticamente el método onUpgrade() cuando intentemos abrir una versión concreta de la base de datos que aún no exista. Para ello, como parámetros recibe la versión actual de la base de datos en el sistema, y la nueva versión a la que se quiere convertir. En función de esta pareja de datos necesitaremos realizar unas acciones u otras. En nuestro caso de ejemplo optamos por la opción más sencilla: borrar la tabla actual y volver a crearla con la nueva estructura, pero como se indica en los comentarios del código, lo habitual será que necesitemos algo más de lógica para convertir la base de datos de una versión a otra y por supuesto para conservar los datos registrados hasta el momento.

Una vez definida nuestra clase helper, la apertura de la base de datos desde nuestra aplicación resulta ser algo de lo más sencillo. Lo primero será crear un objeto de la clase UsuariosSQLiteHelper al que pasaremos el contexto de la aplicación (en el ejemplo una referencia a la actividad principal), el nombre de la base de datos, un objeto CursorFactory que típicamente no será necesario (en ese caso pasaremos el valor null), y por último la versión de la base de datos que necesitamos. La simple creación de este objeto puede tener varios efectos:

  • Si la base de datos ya existe y su versión actual coincide con la solicitada simplemente se realizará la conexión con ella.
  • Si la base de datos existe pero su versión actual es anterior a la solicitada, se llamará automáticamente al método onUpgrade() para convertir la base de datos a la nueva versión y se conectará con la base de datos convertida.
  • Si la base de datos no existe, se llamará automáticamente al método onCreate() para crearla y se conectará con la base de datos creada.

Una vez tenemos una referencia al objeto UsuariosSQLiteHelper, llamaremos a su método getReadableDatabase() o getWritableDatabase() para obtener una referencia a la base de datos, dependiendo si sólo necesitamos consultar los datos o también necesitamos realizar modificaciones, respectivamente.

Ahora que ya hemos conseguido una referencia a la base de datos (objeto de tipo SQLiteDatabase) ya podemos realizar todas las acciones que queramos sobre ella. Para nuestro ejemplo nos limitaremos a insertar 5 registros de prueba, utilizando para ello el método ya comentado execSQL() con las sentencias INSERT correspondientes. Por último cerramos la conexión con la base de datos llamando al método close().

package net.sgoliver.android.bd;

import android.app.Activity;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;

public class AndroidBaseDatos extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //Abrimos la base de datos 'DBUsuarios' en modo escritura
        UsuariosSQLiteHelper usdbh =
        	new UsuariosSQLiteHelper(this, "DBUsuarios", null, 1);

        SQLiteDatabase db = usdbh.getWritableDatabase();

        //Si hemos abierto correctamente la base de datos
        if(db != null)
        {
        	//Insertamos 5 usuarios de ejemplo
        	for(int i=1; i<=5; i++)
        	{
        		//Generamos los datos
        		int codigo = i;
        		String nombre = "Usuario" + i;

        		//Insertamos los datos en la tabla Usuarios
        		db.execSQL("INSERT INTO Usuarios (codigo, nombre) " +
        			       "VALUES (" + codigo + ", '" + nombre +"')");
        	}

        	//Cerramos la base de datos
        	db.close();
        }
    }
}

Vale, ¿y ahora qué? ¿dónde está la base de datos que acabamos de crear? ¿cómo podemos comprobar que todo ha ido bien y que los registros se han insertado correctamente? Vayamos por partes.

En primer lugar veamos dónde se ha creado nuestra base de datos. Todas las bases de datos SQLite creadas por aplicaciones Android utilizando este método se almacenan en la memoria del teléfono en un fichero con el mismo nombre de la base de datos situado en una ruta que sigue el siguiente patrón:

/data/data/paquete.java.de.la.aplicacion/databases/nombre_base_datos

En el caso de nuestro ejemplo, la base de datos se almacenaría por tanto en la ruta siguiente:

/data/data/net.sgoliver.android.bd/databases/DBUsuarios

Para comprobar esto podemos hacer lo siguiente. Una vez ejecutada por primera vez desde Eclipse la aplicación de ejemplo sobre el emulador de Android (y por supuesto antes de cerrarlo) podemos ir a la perspectiva “DDMS” (Dalvik Debug Monitor Server) de Eclipse y en la solapa “File Explorer” podremos acceder al sistema de archivos del emulador, donde podremos buscar la ruta indicada de la base de datos. Podemos ver esto en la siguiente imagen (click para ampliar):

ddms_fileexplorer_database

Con esto ya comprobamos al menos que el fichero de nuestra base de datos se ha creado en la ruta correcta. Ya sólo nos queda comprobar que tanto las tablas creadas como los datos insertados también se han incluido correctamente en la base de datos. Para ello podemos recurrir a dos posibles métodos:

  1. Trasnferir la base de datos a nuestro PC y consultarla con cualquier administrador de bases de datos SQLite.
  2. Acceder directamente a la consola de comandos del emulador de Android y utilizar los comandos existentes para acceder y consultar la base de datos SQLite.

El primero de los métodos es sencillo. El fichero de la base de datos podemos transferirlo a nuestro PC utilizando el botón de descarga situado en la esquina superior derecha del explorador de archivos (remarcado en rojo en la imagen anterior). Junto a este botón aparecen otros dos para hacer la operación contraria (copiar un fichero local al sistema de archivos del emulador) y para eliminar ficheros del emulador. Una vez descargado el fichero a nuestro sistema local, podemos utilizar cualquier administrador de SQLite para abrir y consultar la base de datos, por ejemplo SQLite Administrator (freeware).

El segundo método utiliza una estrategia diferente. En vez de descargar la base de datos a nuestro sistema local, somos nosotros los que accedemos de forma remota al emulador a través de su consola de comandos (shell). Para ello, con el emulador de Android aún abierto, debemos abrir una consola de MS-DOS y utilizar la utilidad adb.exe (Android Debug Bridge) situada en la carpeta platform-tools del SDK de Android (en mi caso: c:\Users\Salvador\AppData\Local\Android\android-sdk\platform-tools\). En primer lugar consultaremos los identificadores de todos los emuladores en ejecución mediante el comando “adb devices“. Esto nos debe devolver una única instancia si sólo tenemos un emulador abierto, que en mi caso particular se llama “emulator-5554“.

Tras conocer el identificador de nuestro emulador, vamos a acceder a su shell mediante el comando “adb -s identificador-del-emulador shell“. Una vez conectados, ya podemos acceder a nuestra base de datos utilizando el comando sqlite3 pasándole la ruta del fichero, para nuestro ejemplo “sqlite3 /data/data/net.sgoliver.android.bd/databases/DBUsuarios“. Si todo ha ido bien, debe aparecernos el prompt de SQLite “sqlite>“, lo que nos indicará que ya podemos escribir las consultas SQL necesarias sobre nuestra base de datos. Nosotros vamos a comprobar que existe la tabla Usuarios y que se han insertado los cinco registros de ejemplo. Para ello haremos la siguiente consulta: “SELECT * FROM Usuarios;“. Si todo es correcto esta instrucción debe devolvernos los cinco usuarios existentes en la tabla. En la imagen siguiente se muestra todo el proceso descrito (click para ampliar):

android_adb_shell_sqlite

Con esto ya hemos comprobado que nuestra base de datos se ha creado correctamente, que se han insertado todos los registros de ejemplo y que todo funciona según se espera.

Puedes consultar y/o descargar el código completo de los ejemplos desarrollados en este artículo accediendo a la página del curso en GitHub.

En los siguientes artículos comentaremos las distintas posibilidades que tenemos a la hora de manipular los datos de la base de datos (insertar, eliminar y modificar datos) y cómo podemos realizar consultas sobre los mismos, ya que [como siempre] tendremos varias opciones disponibles.

Curso de Programación Android en PDF

Este curso también está disponible en PDF. Descubre cómo conseguirlo…

¿Te ha sido de utilidad el Curso de Programación Android? ¿Quieres colaborar de forma económica con el proyecto? Puedes contribuir con cualquier cantidad, unos céntimos, unos euros, cualquier aportación será bienvenida. Además, si tu aportación es superior a una pequeña cantidad simbólica recibirás como agradecimiento un documento con la última versión del curso disponible en formato PDF. Sea como sea, muchas gracias por colaborar!

Más información:

, , ,

46 Responses to Bases de Datos en Android (I): Primeros pasos

  1. Chechu 03/02/2011 at 12:36 #

    Muy buen tutorial! Todo muy claro y bien explicado, no encontraba ningun sitio que explicara cómo ver la base de datos creada. Saludos

  2. Ignacio 04/02/2011 at 19:12 #

    Muy buen tutorial, estoy empezando en la programación para android y justamente me surgia la duda de manejo de datos

    se agradece

  3. Droide 05/02/2011 at 21:06 #

    Como podría crear una base de datos desde mi pc y luego pasarla directamente a la aplicación?

    Trabajo con mysql y tengo un servidor local para aplicaciones web, y la idea es pasar una base de datos de mysql a mi aplicación android, ¿cómo lo hago?

  4. Chechu 07/02/2011 at 13:27 #

    yo he probado con el emulador en ejecucion, exportas la base de datos que estes usando como pone en el tutorial, la modificas con el sqlite administrator y despues la vuelves a importar, todo ello con el emulador de android activo. al iniciar una nueva ejecucion del programa android tendras la base de datos modificada. supongo que habra algun modo mejor de hacerlo, pero bueno este funciona…

  5. luis 10/05/2011 at 18:04 #

    Muy buen tutorial. es justo lo que necesitaba para aprender y funciona perfecto.

    saludos…

  6. William Velandia 16/05/2011 at 18:13 #

    He comenzado a trabajar con Android y lo felicito por estos tutoriales son estupendos. Mi duda es como se puede hacer para crear la base de datos en la SD del Celular pues encontre un tutorial con esta instrucción SQLiteDatabase.openDatabase(“/sdcard/DBUsuarios.db”, null, SQLiteDatabase.OPEN_READWRITE + SQLiteDatabase.CREATE_IF_NECESSARY);
    Le antepuse la instruccion /sdcard/ antes del nombre de la base de datos y me saca un error. gracias…

  7. Antonio 17/05/2011 at 16:59 #

    Hola!

    Enhorabuena por el trabajo realizado. Me ha sido muy util, pero me he encontrado con el siguiente problema.

    He creado una base de datos desde una app tal como explicais en el tutorial. Al ejecutarla sobre el emulador, la aplicación funciona perfectamente (puedo hacer consultas a la base de datos perfectamente)

    El problema surge cuando instalo dicha aplicacion en un terminal. Tras instalarla y ejecutar la app, me devuelve la siguiente excepcion SQLException

    no such table: nombre_tabla: , while compiling: select * ….

    Teneis la solucion a este problema?

    Muchas gracias.

    Un slaudo

  8. Adolfo 26/05/2011 at 9:34 #

    A mi me queda una duda, donde se crea la base de datos exactamente? esque en el codigo no lo veo por ningun lado.
    gracias por el tutorial
    un saludo

  9. Marcelo 08/07/2011 at 20:41 #

    Gracias por tutorial, esta buenísimo, pero les comento que la primera vez funcionó todo bien, pero cunado borre la base en el DDMS, ya no la volvió a crear, intente cambiándole de nombre y me crea un archivo que con el nombre de la base pero no lo puedo leer, y la aplicación termina. Intente copiar ese archivo y me sale “Failed to pull selection” o al intentar copiar una base que ya tenía sale “Failed to push the item(s)”. Haber si alguien me puede ayudar.
    Un saludos.

  10. jmrlegido 08/09/2011 at 8:26 #

    Genial. Perfectamente explicado y todo funciona a la primera.
    Muchísimas gracias.

  11. Darry Castro 17/02/2012 at 21:29 #

    tendran el zip. por hay..?

  12. Luz 06/03/2012 at 0:07 #

    Hola, me ha servido mucho este tutoria =).

    Como podria descargar mi base de datos en MySQL a mi aplicacion Android y asi vaciarla en la BD de SQLite???

    Si me pudieras ayudar te lo agradeceria muchisimo =)

  13. Nano 13/03/2012 at 22:03 #

    Gracias por el tutorial!.

  14. francisco javier 16/03/2012 at 16:11 #

    cual es el tamaño maximo que puede tener una base de datos en sqlite

  15. Sergio 28/03/2012 at 17:49 #

    Hola, me parece genial tu blog. ya lo he visitado en varias ocasiones. Tengo una duda que me desconcierta. Cuando instalo la aplicación en el emulador me crea la base de datos vacía, no me mete las tablas.

    En onCreate(SQLiteDatabase db) no he puesto ninguna sentencia CREATE ni nada, pero es que hice otra aplicación “EatTool”, y no tengo en ningún sitio nada de CREATE TABLE, y en la instalación me copia la base de datos que he diseñado en eclipse.

    Me estoy volviendo loco en saber la razón por la que en un programa me copia la BD con sus tablas y en otra la BD sin tablas…

    Sabes cuál es el error?

    gracias!

  16. Omar 27/04/2012 at 18:30 #

    Muchas gracia por el tut es de lo mejor, me estoy iniciando en esto de android y de verdad toda esta info me ha ido muy bien. Te agradesco mucho. EXELENT

  17. Pablo 18/06/2012 at 23:40 #

    Para acceder a la base de datos SQLite desde una actividad tengo que crear un objeto creado por mi que herede de SQLiteOpenHelper.

    Si tengo 5 actividades seguidas y en cada una de ellas tengo que acceder a la base de datos debo crear 5 objetos SQLiteOpenHelper?

    No hay manera de crear un objeto SQLiteOpenHelper y rehutilizarlo en el resto de actividades en vez de crear 5 objetos??

    Gracias y un saludo

  18. Jesús Alberto 11/09/2012 at 15:33 #

    Hola, muy buena info, me sirvio de mucho :D
    Por cierto! en la Play Store hay algunas aplicaciones que pueden servir
    para checar las BD desde la misma Terminal :D
    Esta SQLite Manager :D o SQLite Editor :)
    Gracias por proporcionar esta información, Saludos.

  19. ChUsMa 18/10/2012 at 21:21 #

    Tremendo documento, me encanta. Me ha ayudado muchisimo. Gracias!

  20. Eje 28/10/2012 at 21:00 #

    Muy buenos artículos.
    He conseguido hacer funcionar mi primera aplicación en Android y esta tiene acceso a un SQLite (llevo años trabajando con BDs o sea que no tengo problema con ellas).
    Mi problema es que ahora estoy intentando organizar y optimizar el código separando toda la lógica de la BD en una clase creada por mí para ese uso y consigo que funcione todo en la clase salvo lo más básico: la apertura de la BD.
    Para ello utilizo un objeto SQLiteDatabase y abro la conexión con la función: openOrCreateDatabase(nombreBD, MODE_WORLD_WRITEABLE, null).
    Cuando ejecuto eso desde uno de los activities funciona perfectamente, pero si me llevo el código a la clase propia, me da 2 errores: uno porque no reconoce la constante MODE_WORLD_WRITEABLE y otro porque no reconoce la función openOrCreateDatabase.
    Supongo que será porque le falta algún import que es el que contiene esas definiciones, pero he probado a añadirle a la clase todos los import que tiene alguno de los activities donde funciona la instrucción, y sigue dando el mismo error.
    De momento tiro haciendo la apertura de la BD en las activities y pasándole el objeto SQLiteDatabase a los métodos de la clase para que trabaje con ella. Funciona perfectamente pero es absurdo hacer algo así cuando lo que pretendo es que la clase haga todo el trabajo con la BD ella misma y que las activities se dediquen a pedirle datos, ignorando todo lo que haya por detrás.
    ¿Alguna idea de qué estoy pasando por alto?

  21. admin 29/10/2012 at 9:49 #

    Si consultas la documentación de Android verás que tanto la constante MODE_WORLD_WRITABLE como el método openOrCreateDatabase() pertenecen a la clase Context, de ahí que ambos te funcionen si los utilizas dentro de una Activity (que hereda de Context) y no fuera de ella.

    Teniendo esto en cuenta, una solución sencilla sería pasas al constructor de tu clase de acceso a datos una referencia a tu Activity, y llamar al método openOrCreateDatabase() sobre dicha referencia.

    Sería algo así:

    public class MiActividad extends Activity
    {
       private ClaseAccesoDatos cad;
       
       public void onCreate(...)
       {
          cad = new ClaseAccesoDatos(this);
    
          cad.abrirBaseDatos(...);
       }
    }
    
    public class ClaseAccesoDatos
    {
       private Context contexto;
    
       public ClaseAccesoDatos(Context contexto)
       {
          this.contexto = contexto;
       }
    
       public void abrirBaseDatos(...)
       {
          SqliteDatabase db = 
             contexto.openOrCreateDatabase(
                nombreBD, contexto.MODE_WORLD_WRITEABLE, null);
       }
    }
    

    Espero que te sirva.

  22. Nacho 03/11/2012 at 16:50 #

    Sólo quería agradecerte tanto este como otros tutoriales que has hecho sobre Android, me has ahorrado muchísimos quebraderos de cabeza.

    Muchas gracias.

  23. Anibal Santiago 15/11/2012 at 17:08 #

    muy bueno te felicito , me gustaría ponerte de referencia , si me lo permites

  24. geek 26/11/2012 at 23:23 #

    el mejor curso de programación en android en castellano.

  25. Augusto Rojas 25/02/2013 at 6:28 #

    Es la primera vez que entro y realmente esta muy interesante, felicitaciones.

    Augusto Rojas
    Lima-Peru

  26. rafael 13/03/2013 at 20:20 #

    Que tal. Felicidades por tu tutorial, me sirvio bastante para introducirme al desarrollo en android. Actualmente he desarrollado una aplicacion tipo encuesta en la cual se van recabando datos a trabes de una tabla en sqlite. Ya he logrado hacer un ABC desde el dispositivo, Ahora mi pregunta es si es que tu supieras algo al respecto, es posible generar una funcion a la aplicacion que me exporte la( s ) tablas y se sincronicen en la PC ya sea SQL Server o MySQL?

  27. Julius 56 20/03/2013 at 18:56 #

    Muy bueno el tutorial. Es una ayuda inestimable.
    El tiempo que me he ahorrado bien vale una buena donación.
    Saludos y muchas gracias.

  28. jose 07/04/2013 at 2:47 #

    Hola a todos, necesito ayuda para sincronizar datos desde sqlite a mysql, me explico. suponiendo que tengo una aplicación corriendo en un android y que esta aplicación almacene los datos correspondiente en sqlite y mediante alguna opción que envíe los datos recopilado en sqlite a mysql que se encuentra en un servidor dedicado.

  29. Johan Quijano 08/04/2013 at 18:11 #

    Saludos,

    Perdón la ignorancia pero tengo entendido que al ejecutar ese onUpgrade del ejemplo, se borra TODA la tabla y luego se vuelve a crear?

    Si yo tengo datos, eso no estaría mal hecho?

    Sería bueno usar un ALTER TABLE en vez de borrar y crear.

    Saludos, gracias por su excelente guía.

  30. Eduardo 09/04/2013 at 0:21 #

    Muy bueno de verdad, gracias por el aporte.

    Un saludo!

  31. carloshc87 04/09/2013 at 4:55 #

    Muchas gracias por el tutorial, muy bueno y útil.

    Me queda una duda. Veo que no pusiste el db.Close() para cerrar la conexión con la base de datos. Es esto correcto? Cuando en mi caso agrego esa línea al final del método onCreate(), al hacer clic en cualquier de los botones se cae la aplicación, pero no entiendo por qué.

    Otra consulta. Veo que al crear la tabla, se indicó que el código sería del tipo INTEGER. Sin embargo, cuando se agregan los valores al ContentValues se agrega el código como String. De todas formas, al ejecutar la aplicación se crean y modifican los registros correctamente. Es correcto manejar en el ContentValues Strings de forma independiente al tipo de datos que tengan las columnas en la tabla? Esto lo maneja automáticamente Android haciendo los cambios de tipos de datos automáticamente?

    Muchas gracias, tiene un gran valor para mi este tutorial.

    saludos

  32. Víctor 07/09/2013 at 10:41 #

    Lo primero felicitarte por la web, me ha sorprendido gratamente tanto la extensión de temas que se tocan como la calidad de los mismos.

    Supongo que por tu experiencia podrás aconsejarme en lo siguiente:

    Es una aplicación que va a hacer un uso continuo de la base de datos, ya sea para lecturas o escrituras en la misma desde distintos activitys, mi pregunta es: recomiendas abrir y cerrar en cada uso o bien declarar el Helper como static y public para que desde cualquier activity pueda invocarlo. Lo comento por rendimiento de abrir y cerrar la bd continuamente. Desde tu punto de vista que aconsejarías.

    Un abrazo y de nuevo felicitarte por la labor que realizas

    Víctor

  33. WILFER 25/09/2013 at 19:37 #

    Buenas Tardes Señores
    Bueno estoy buscando como hacer mi propio motor de Base de Datos, ya que no veo por que seguir las BD tradicionales, trabajo con SQL, pero veo deficiencias y por eso quiero hacer mi propio motor.
    Alguien me puede dar una mano de como comenzar, les adelanto solo guardaría una sola vez el (10) en toda la BD y la información no se pierde, en BD(sql) se guarda n-veces.

    Buena Tarde

  34. Daniel 11/10/2013 at 0:16 #

    Hola, una pregunta: cuando insertas los datos en

    db.execSQL(“INSERT INTO Usuarios (codigo, nombre) ” +
    “VALUES (” + codigo + “, ‘” + nombre +”‘)”);

    ¿cuál es la razón de usar comillas dobles dentro de comillas sencillas (‘” + nombre +”‘)?

    Estuve leyendo la documentación oficial, pero no encontré nada específico al respecto. Creo que se nota que soy novato en las BD’s, y si mi pregunta es muy tonta, espero que al menos alguien pueda decirme en qué parte de la documentación viene este tema o qué libro o página web puedo consultar.

    Saludos

  35. daniel 02/11/2013 at 4:49 #

    sera que puedes implementar guardar una imagen en la base de datos
    gracias me ayudaría mucho

  36. Jorge 05/11/2013 at 19:54 #

    Corrí la aplicación en mi Android, pero no puedo ver la base de datos creada, busque en la carpeta data/data de la memoria interna del telefono y nada.

    Alguien me puede indicar si debo de rootear el telefono, o por qué no puede ver la base de datos.
    Gracias..

  37. Alejo 08/11/2013 at 13:49 #

    Muy buen tutorial. Gran trabajo el que haces con estos tutoriales.

    Muchas gracias

  38. pablo 03/01/2014 at 23:41 #

    Saludos.
    Tengo un problema con:

    setContentView(R.layout.main);

    me sale que main no puede ser resuelto o no es un campo, trate de usar las opciones que me da eclipse para modificar pero esas clases no se dejan modificar.
    como podria hacer para no tener este problema.
    muchas gracias de antemano.

  39. SBL 08/01/2014 at 15:20 #

    Hola, muchas gracias por el tutorial. Tengo una BD en un huawei U8110 pero no me permite acceder a la BD a través del DDMS, al parecer no reconoce el dispositivo (aparece algo como ?????? Offline unknown), he consultado en muchos foros y no he podido solucionarlo aún. Alguna idea?. De antemano, muchas gracias.

  40. Eduardo Moreno 28/01/2014 at 5:20 #

    Me parece excelente

  41. Juanen 12/02/2014 at 15:49 #

    Lo primero es darte la enhorabuena por el tutorial (tengo también el pdf)

    ¿Y si queremos usar una base da datos que hemos creado fuera de Android?
    Yo tengo una base de datos con equipos de futbol (unos 200) agrupados por categorías. Y además una serie de eventos y partidos.

    Así que mi BD es compleja y la he creado con SQLite Administrator. ¿Como la paso al programa?

    Saludos

  42. Lau 20/08/2014 at 15:54 #

    Hola, no acabo de entender muy bien el funcionamiento de SQLite.

    Por ejemplo, tengo una tabla donde aparecen los nombres de usuario registrados. Estos nombres de usuario tienen que ser únicos.

    Mi duda es, que si la tabla se crea cada vez de forma independiente en cada dispositivo, como podría controlar que los nombres de usuarios no se repitan? O SQLite solo se utilizaría, por ejemplo, para las puntuaciones en un juego?

    Gracias.

Trackbacks/Pingbacks

  1. Desarrollo en Android | sgoliver.net blog - 31/01/2011

    […] Bases de datos en Android (I): Primeros pasos con SQLite […]

  2. Bases de Datos en Android (II): Insertar/Actualizar/Eliminar | sgoliver.net blog - 03/02/2011

    […] el artículo anterior del curso de programación en Android vimos cómo crear una base de datos para utilizarla desde […]

  3. Ficheros en Android (I): Memoria Interna | sgoliver.net blog - 21/11/2011

    […] datos en nuestras aplicaciones, como por ejemplo los ficheros de preferencias compartidas o las bases de datos SQLite. Estos mecanismos son perfectos para almacenar datos estructurados, pero en ocasiones nos seguirá […]

  4. Preferencias en Android I: Shared Preferences | sgoliver.net blog - 21/06/2013

    […] ya uno de los métodos disponibles en la plataforma Android para almacenar datos, como son las bases de datos SQLite. Las preferencias de una aplicación se podrían almacenar por su puesto utilizando este método, y […]

Deja un comentario