Foros del Web » Programando para Internet » Android »

Problema con SQLiteOpenHelper

Estas en el tema de Problema con SQLiteOpenHelper en el foro de Android en Foros del Web. Hola, Tengo esta clase: Código: public class SQLiteHelper extends SQLiteOpenHelper { private static final String DB_NAME = "Clientes"; private static final int DB_VERSION = 1; ...
  #1 (permalink)  
Antiguo 15/11/2011, 15:53
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 16 años
Puntos: 1
Pregunta Problema con SQLiteOpenHelper

Hola,

Tengo esta clase:

Código:
public class SQLiteHelper extends SQLiteOpenHelper {
	private static final String DB_NAME = "Clientes";
	private static final int DB_VERSION = 1;
	public SQLiteHelper(Context context){
		super(context, SQLiteHelper.DB_NAME, null, SQLiteHelper.DB_VERSION);
		Log.d("SQLiteHelper","public SQLiteHelper(Context context){");
	}
	
	@Override
	public void onCreate(SQLiteDatabase db){
		Log.d("SQLiteHelper","onCreate()");
		if (db.isReadOnly())
			db = getWritableDatabase();
		db.execSQL("CREATE TABLE Cliente(_ID INTEGER PRIMARY KEY AUTOINCREMENT, nombre TEXT);");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
		Log.d("SQLiteHelper","onUpgrade()");
	}

}
Dicha clase la instancio desde otra clase con este código:

Código:
SQLiteHelper sqliteHelper = new SQLiteHelper(getApplicationContext());
Tengo entendido que el método onCreate() de la clase que hereda de SQLiteOpenHelper se llama automáticamente si la base de datos no está creada y en caso contrario se llama automáticamente al método onUpgrade(). Pues bien, el problema que tengo es que no se llama ni uno ni otro.

Tampoco veo ningún archivo que se llame "Clientes" en las carpetas del proyecto.

¿Qué puedo estar haciendo mal?

Muchas gracias.
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows
  #2 (permalink)  
Antiguo 15/11/2011, 16:33
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 11 meses
Puntos: 43
Respuesta: Problema con SQLiteOpenHelper

Hola letni !

En el método onCreate no es necesario que preguntes si la base de datos es de sólo lectura para obtener la que tiene permisos de escritura, ejecuta las consultas directamente porque la db que se pasa por referencia ya tiene los permisos de escritura.

Código java:
Ver original
  1. public void onCreate(SQLiteDatabase db) {
  2.         Log.d("SQLiteHelper","onCreate()");
  3.         db.execSQL("CREATE TABLE Cliente(_ID INTEGER PRIMARY KEY AUTOINCREMENT, nombre TEXT);");
  4. }

Pero no creo que ese sea el problema, ya revisaste desde el adb shell que se esté creando la base de datos correctamente ¿?

Si no sabes de que hablo, ya que esté ejecutándose la aplicación en el emulador que trae eclipse, entra al símbolo del sistema de tu sistema operativo (ojo, antes debes de tener definida en tu variable entorno "path" la ruta de la carpeta platform-tools del sdk android si no tendrás que poner la ruta absoluta del adb.exe al ejecutarlo:

Entonces pones:
Código:
#adb shell
Ya que lo ejecutes, debes ir a la ruta:
Código:
#cd data/data/{paquete de tu proyecto}/databases/
Si no sabes cual es el paquete de tu proyecto puedes utilizar el comando ls para listar el contenido.
Código:
#ls
Dentro de databases debe estar tu base de datos que llamaste Clientes, así que ejecuta el siguiente comando:
Código:
#sqlite3 Clientes
Ahora desde aquí ya puedes hacer consultas a la DB, fijate si el catálogo Cliente existe o intenta ejecutar la consulta CREATE TABLE Cliente(_ID INTEGER PRIMARY KEY AUTOINCREMENT, nombre TEXT) directamente haber si no te marca un error.

Un saludo y suerte !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #3 (permalink)  
Antiguo 16/11/2011, 00:20
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 16 años
Puntos: 1
Respuesta: Problema con SQLiteOpenHelper

Hola,

Llego hasta el paso de hacer:

Código:
#adb shell
Pero me sale esto:
Código:
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
error: device not found
De todos modos, volviendo a mi código. Si no salen los logs del onCreate(), ¿no deberían de salir los del onUpgrade()?
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows
  #4 (permalink)  
Antiguo 16/11/2011, 12:59
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 11 meses
Puntos: 43
Respuesta: Problema con SQLiteOpenHelper

Cita:
Iniciado por letni Ver Mensaje
Hola,

Llego hasta el paso de hacer:

Código:
#adb shell
Pero me sale esto:
Código:
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
error: device not found
De todos modos, volviendo a mi código. Si no salen los logs del onCreate(), ¿no deberían de salir los del onUpgrade()?
Hola letni !

En lo del adb shell, si estaba el emulador corriendo cuando intestaste entrar ¿?

En el logcat entonces no te sale el aviso que se invocó el método onCreate ?, a lo mejor la base de datos ya se creo y por eso no te lo notifica, si ya habías ejecutado la aplicación puede que ya se haya creado y en posteriores ejecuciones ya no es necesaria la creación, puedes cambiar tu constante DB_VERSION por ejemplo a la 2 para forzar el llamado del método onUpgrade, agrega un breakpoint en el cuerpo del método y depura la aplicación, porque luego en el log te pierdes de tanto mensaje, jeje.

Ve si puedes hacer funcionar el shell porque con eso te vas a evitar varios dolores de cabeza de que si la creación se hizo o no se hizo, si falla alguna consulta, etc...

También puedes utilizar el la ventana file explorer, la puedes habilitar en windows->show view y selecciona la opción de android, ahí debe de mostrarte la opción, navega a la ruta data/data/{paquete proyecto}/databases/, debes de ver tu base de datos Clientes, si no está es que no se creo, la desventaja es que sólo puedes ver la DB física pero para poder consultarla y hacer cambios lo tienes que hacer desde el adb shell, como te lo dije arriba.

Un saludo y suerte !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #5 (permalink)  
Antiguo 17/11/2011, 00:38
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 16 años
Puntos: 1
Respuesta: Problema con SQLiteOpenHelper

Cita:
Iniciado por jahepi Ver Mensaje
Hola letni !

En lo del adb shell, si estaba el emulador corriendo cuando intestaste entrar ¿?
Hola jahepi,

No tenía el Eclipse abierto y el emulador, por tanto, tampoco, no sabía que era necesario.
He vuelto a repetir lo pasos con el Eclipse abierto y el emulador corriendo, y ahora ya me ha funcionado el adb shell, pero no hay ninguna carpeta llamada databases dentro de data/data/{paquete de mi proyecto}/
Sólo hay una carpeta llamada lib.

Cita:
Iniciado por jahepi Ver Mensaje
En el logcat entonces no te sale el aviso que se invocó el método onCreate ?, a lo mejor la base de datos ya se creo y por eso no te lo notifica, si ya habías ejecutado la aplicación puede que ya se haya creado y en posteriores ejecuciones ya no es necesaria la creación,
No, no sale que se invocó al método onCreate().
Pero entonces, si ya se ha creado en algún momento, ¿no debería llamarse el método onUpgrade()?

Cita:
Iniciado por jahepi Ver Mensaje
puedes cambiar tu constante DB_VERSION por ejemplo a la 2 para forzar el llamado del método onUpgrade, agrega un breakpoint en el cuerpo del método y depura la aplicación, porque luego en el log te pierdes de tanto mensaje, jeje.
El onUpgrade(), ¿sólo se llama si cambio el valor de la constante DB_VERSION?

Cita:
Iniciado por jahepi Ver Mensaje
También puedes utilizar el la ventana file explorer, la puedes habilitar en windows->show view y selecciona la opción de android, ahí debe de mostrarte la opción, navega a la ruta data/data/{paquete proyecto}/databases/, debes de ver tu base de datos Clientes, si no está es que no se creo, la desventaja es que sólo puedes ver la DB física pero para poder consultarla y hacer cambios lo tienes que hacer desde el adb shell, como te lo dije arriba.
Voy a Window --> Show view --> Project Explorer en el Eclipse y se me abre, en la parte de la izquierda, una vista con un árbol de navegación con todos mis proyectos, es una vista muy parecida a la de Package Explorer. Navego por el árbol de mi proyecto pero no veo ninguna carpeta llamada data.

A ver si me puedes/podéis seguir echando una mano, estamos avanzando :)
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows
  #6 (permalink)  
Antiguo 17/11/2011, 12:21
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 11 meses
Puntos: 43
Respuesta: Problema con SQLiteOpenHelper

Hola letni !

Cita:
No tenía el Eclipse abierto y el emulador, por tanto, tampoco, no sabía que era necesario.
He vuelto a repetir lo pasos con el Eclipse abierto y el emulador corriendo, y ahora ya me ha funcionado el adb shell, pero no hay ninguna carpeta llamada databases dentro de data/data/{paquete de mi proyecto}/
Sólo hay una carpeta llamada lib.
Si no está la carpeta databases entonces no se ha creado, así no podrás utilizar el comando sqlite3 dentro del shell.

Cita:
No, no sale que se invocó al método onCreate().
Pero entonces, si ya se ha creado en algún momento, ¿no debería llamarse el método onUpgrade()?

El onUpgrade(), ¿sólo se llama si cambio el valor de la constante DB_VERSION?
De hecho la primera vez siempre se llama al método onCreate se registra la versión de la base de datos que tienes en la constante, onUpgrade se llama si cambias la versión de la base de datos, que es cambiando tu constante DB_VERSION, siempre y cuando no sea diferente no se invocará.

Cita:
Voy a Window --> Show view --> Project Explorer en el Eclipse y se me abre, en la parte de la izquierda, una vista con un árbol de navegación con todos mis proyectos, es una vista muy parecida a la de Package Explorer. Navego por el árbol de mi proyecto pero no veo ninguna carpeta llamada data.
Me equivoqué es en Window -> Show View -> Other, vas al apartado de android y añades el File Explorer, pero vas a encontrar lo mismo que viste desde el shell, sólo vas a encontrar la carpeta lib dentro de tu proyecto.

Si no se ha creado la DB, debería llamarse el método onCreate, lo que se me ocurre es que agregues 3 break points y veas línea por línea que es lo que está pasando, coloca uno en el constructor, otro en el método onCreate y otro en el onUpgrade, en el onUpgrade trata cambiando la versión para que sea invocado, ve paso a paso con el ícono step over en modo de depuración.

Un saludoo y suerte !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #7 (permalink)  
Antiguo 17/11/2011, 13:15
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 16 años
Puntos: 1
Respuesta: Problema con SQLiteOpenHelper

Hola jahepi,

Ya he abierto el File Explorer correcto desde Window --> Show view --> Other... --> Android --> File Explorer, pero no veo más que un montón de carpetas vacías que se llaman "con" (hay muchas con este nombre), una que se llama "an" y luego otras que se llaman "es.r" y "jp.c". No veo lo mismo que con el adb shell.

Respecto de los tres break points, los he metido donde dices y sólo pasa por el constructor. Por el onUpgrade() no pasa ni cambiando el parámetro DB_VERSION.

No se qué puede estar mal.
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows
  #8 (permalink)  
Antiguo 17/11/2011, 16:18
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 16 años
Puntos: 1
Respuesta: Problema con SQLiteOpenHelper

Gracias jahepi,

Ya está resuelto, el problema era que no realizaba ninguna consulta o ejecutaba alguna sentencia sobre la base de datos. Pensaba que con instanciar el objeto de la clase que hereda de SQLiteOpenHelper era suficiente para que el método onCreate() se llamara automáticamente.

He mirado los registros mediante el adb shell y los veo.

No lo he conseguido a través del File Explorer, ¿me echas una mano con esto último?
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows
  #9 (permalink)  
Antiguo 17/11/2011, 19:11
Avatar de jahepi
Colaborador
 
Fecha de Ingreso: diciembre-2004
Ubicación: Querétaro
Mensajes: 1.124
Antigüedad: 19 años, 11 meses
Puntos: 43
Respuesta: Problema con SQLiteOpenHelper

Cita:
Iniciado por letni Ver Mensaje
Gracias jahepi,

Ya está resuelto, el problema era que no realizaba ninguna consulta o ejecutaba alguna sentencia sobre la base de datos. Pensaba que con instanciar el objeto de la clase que hereda de SQLiteOpenHelper era suficiente para que el método onCreate() se llamara automáticamente.

He mirado los registros mediante el adb shell y los veo.

No lo he conseguido a través del File Explorer, ¿me echas una mano con esto último?
Hola letni !

Me alegra que lo hayas resuelto, también pensaba que al instanciar la clase se llamaría automáticamente el método onCreate, jaja, voy empezando y se van aprendiendo cosas sobre la marcha.

Fíjate que el File Explorer sólo es para explorar los archivos, nada mas vas a poder ver el archivo Clientes, si quieres ver los catálogos, consultarlos, insertar, etc... sólo podrás por el adb shell utilizando el comando sqlite3.

Un saludo y suerte !
__________________
Una contraseña es como la ropa interior. No deberías dejarlas afuera a la vista de otras personas, deberías cambiarla regularmente, y ni se te ocurra prestarla a extraños.
  #10 (permalink)  
Antiguo 18/11/2011, 00:26
 
Fecha de Ingreso: octubre-2008
Mensajes: 276
Antigüedad: 16 años
Puntos: 1
Respuesta: Problema con SQLiteOpenHelper

Cita:
Iniciado por jahepi Ver Mensaje
Fíjate que el File Explorer sólo es para explorar los archivos, nada mas vas a poder ver el archivo Clientes, si quieres ver los catálogos, consultarlos, insertar, etc... sólo podrás por el adb shell utilizando el comando sqlite3.
Pero a través del File Explorer, ¿no voy a poder seguir la ruta data/data/{paquete del proyecto}/databases/?

¿Dónde debería estar el archivo "Clientes"? No lo veo a través del File Explorer.
__________________
Uso Apache 2.2 con PHP 5.5.9 y MySQL 5.1
Uso Eclipse IDE for Java Developers, Version: Mars.1 Release (4.5.1), Build id: 20150924-1200 para programar en Java bajo Windows

Etiquetas: todo, apps
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:11.