He creado mis tablas en mi SQLiteOpenHelper
onCreate()
pero recibo
SQLiteException: no such table
o
SQLiteException: no such column
errores ¿Por qué?
NOTA:
(Este es el resumen amalgamado de decenas de preguntas similares cada semana. Intentando proporcionar una pregunta / respuesta wiki comunitaria "canónica" aquí para que todas esas preguntas puedan ser dirigidas a una buena referencia).
Respuestas:
SQLiteOpenHelper
onCreate()
y lasonUpgrade()
devoluciones de llamada se invocan cuando la base de datos se abre realmente, por ejemplo, mediante una llamada agetWritableDatabase()
. La base de datos no se abre cuando se crea el objeto auxiliar de la base de datos.SQLiteOpenHelper
versiones de los archivos de la base de datos. El número de versión es elint
argumento pasado al constructor . En el archivo de la base de datos, el número de versión se almacena enPRAGMA user_version
.onCreate()
solo se ejecuta cuando el archivo de la base de datos no existía y se acaba de crear. SionCreate()
regresa con éxito (no arroja una excepción), se supone que la base de datos se crea con el número de versión solicitado. Como una implicación, no debes atraparteSQLException
enonCreate()
ti mismo.onUpgrade()
solo se llama cuando existe el archivo de base de datos pero el número de versión almacenado es inferior al solicitado en el constructor. ElonUpgrade()
debe actualizar el esquema de la tabla a la versión solicitada.Al cambiar el esquema de la tabla en el código (
onCreate()
), debe asegurarse de que la base de datos esté actualizada. Dos enfoques principales:Elimine el antiguo archivo de base de datos para que
onCreate()
se ejecute nuevamente. Esto suele preferirse en el momento del desarrollo, donde tiene control sobre las versiones instaladas y la pérdida de datos no es un problema. Algunas formas de eliminar el archivo de base de datos:Desinstala la aplicación. Use el administrador de aplicaciones o
adb uninstall your.package.name
desde el shell.Borrar datos de la aplicación. Utiliza el administrador de aplicaciones.
Incremente la versión de la base de datos para que
onUpgrade()
se invoque. Esto es un poco más complicado ya que se necesita más código.Para las actualizaciones del esquema de tiempo de desarrollo donde la pérdida de datos no es un problema, solo puede usar
execSQL("DROP TABLE IF EXISTS <tablename>")
para eliminar sus tablas existentes y llamaronCreate()
para volver a crear la base de datos.Para las versiones lanzadas, debe implementar la migración de datos
onUpgrade()
para que sus usuarios no pierdan sus datos.fuente
onUpdate()
, verifique cada versión anterior y realice la migración de datos adecuada. Y luego, cuando un usuario actualiza su aplicación (tiene archivos db antiguos), seonUpgrade
activará y, si el usuario está recién instalado,onCreate()
se activará.Para agregar más puntos faltantes aquí, según la solicitud de Jaskey
La versión de la base de datos se almacena en el
SQLite
archivo de la base de datos.catch es el constructor
Entonces, cuando se llama al constructor auxiliar de la base de datos con un
name
(segundo parámetro), la plataforma verifica si la base de datos existe o no y si la base de datos existe, obtiene la información de la versión del encabezado del archivo de la base de datos y activa la devolución de llamada correctaComo ya se explicó en la respuesta anterior, si la base de datos con el nombre no existe, se dispara
onCreate
.La explicación a continuación explica el
onUpgrade
caso con un ejemplo.Digamos, su primera versión de la aplicación tenía la versión
DatabaseHelper
(que se extendíaSQLiteOpenHelper
) con el constructor que pasaba la versión1
y luego proporcionó una aplicación actualizada con el nuevo código fuente que tenía la versión aprobada2
, y automáticamente cuandoDatabaseHelper
se construye, la plataforma se disparaonUpgrade
al ver que el archivo ya existe, pero la versión es inferior a la versión actual que ha pasado.Ahora supongamos que planea dar una tercera versión de la aplicación con la versión db como
3
(la versión db se incrementa solo cuando se va a modificar el esquema de la base de datos). En tales actualizaciones incrementales, debe escribir la lógica de actualización de cada versión de forma incremental para obtener un mejor código mantenibleEjemplo de pseudocódigo a continuación:
Observe la
break
declaración que falta en el caso1
y2
. Esto es lo que quiero decir con actualización incremental.Decir si la versión antigua es
2
y nuevas versiones4
, entonces la lógica se actualice la base de datos a partir2
de3
y después de4
Si la versión antigua es
3
y nuevas versiones4
, se acaba de ejecutar la lógica de actualización para3
a4
fuente
onCreate()
Cuando creamos DataBase por primera vez (es decir, la base de datos no existe)
onCreate()
crea una base de datos con la versión que se pasaSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
onCreate()
El método es crear las tablas que ha definido y ejecutar cualquier otro código que haya escrito. Sin embargo, este método solo se llamará si falta el archivo SQLite en el directorio de datos de su aplicación (/data/data/your.apps.classpath/databases
).No se llamará a este método si ha cambiado su código y se ha relanzado en el emulador. Si desea
onCreate()
ejecutar, debe usar adb para eliminar el archivo de base de datos SQLite.onUpgrade()
SQLiteOpenHelper
debería llamar al súper constructor.onUpgrade()
método sólo será llamada cuando el número entero versión es mayor que la versión actual que se ejecuta en la aplicación.onUpgrade()
que se llame al método, debe incrementar el número de versión en su código.fuente
Puede que sea demasiado tarde, pero me gustaría compartir mi respuesta breve y dulce. Por favor, marque Respuesta para un mismo problema. Definitivamente te ayudará. No más especificaciones profundas.
Si está seguro de la sintaxis para crear una tabla, entonces puede suceder cuando agrega una nueva columna en su misma tabla, para eso ...
1) Desinstale de su dispositivo y ejecútelo nuevamente.
O
2) Configuración -> aplicación -> ClearData
O
3) Cambie
DATABASE_VERSION
en su clase "DatabaseHandler" (si ha agregado una nueva columna, se actualizará automáticamente)O
4) Cambie
DATABASE_NAME
en su clase "DatabaseHandler" (me enfrenté al mismo problema. Pero tengo éxito al cambiarDATABASE_NAME
).fuente
Puntos para recordar al extender
SQLiteOpenHelper
super(context, DBName, null, DBversion);
- Se debe invocar la primera línea del constructor.onCreate
yonUpgrade
(si es necesario)onCreate
se invocará solo cuandogetWritableDatabase()
ogetReadableDatabase()
se ejecute. Y esto solo se invocará una vez cuando unDBName
especificado en el primer paso no esté disponible. Puede agregar crear tabla de consulta en elonCreate
métodoDBversion
y realice las consultas en laonUpgrade
tabla o simplemente desinstale e instale la aplicación.fuente
Se llama a onCreate por primera vez cuando se necesita la creación de tablas. Necesitamos anular este método donde escribimos el script para la creación de la tabla que es ejecutado por SQLiteDatabase. Método execSQL. Después de ejecutar la primera implementación, este método no se llamará en adelante.
onUpgrade Este método se llama cuando se actualiza la versión de la base de datos. Supongamos que, por primera vez, la versión de la base de datos fue 1 y en la segunda implementación hubo un cambio en la estructura de la base de datos, como agregar una columna adicional en la tabla. Supongamos que la versión de la base de datos es 2 ahora.
fuente
Puede crear bases de datos y tablas como
Nota: si desea crear otra tabla o agregar columnas o ninguna, simplemente incremente la VERSIÓN
fuente
La base de datos SQLite anula dos métodos
1) onCreate (): este método se invoca solo una vez cuando la aplicación se inicia por primera vez. Entonces llamó solo una vez
2) onUpgrade () Este método se llama cuando cambiamos la versión de la base de datos, luego se invoca este método. Se utiliza para alterar la estructura de la tabla como agregar una nueva columna después de crear el esquema de base de datos
fuente
no se encuentra dicha tabla principalmente cuando no ha abierto la
SQLiteOpenHelper
clase congetwritabledata()
y antes de esto también debe llamar a make constructor con databasename & version. YOnUpgrade
se llama cada vez que hay un valor de actualización en el número de versión dado en laSQLiteOpenHelper
clase.A continuación se muestra el fragmento de código (tal columna no encontrada puede deberse a la ortografía en el nombre de la columna):
fuente
Si olvida proporcionar una cadena de "nombre" como segundo argumento para el constructor, crea una base de datos "en memoria" que se borra al cerrar la aplicación.
fuente
Desinstale su aplicación del emulador o dispositivo. Ejecute la aplicación nuevamente. (OnCreate () no se ejecuta cuando la base de datos ya existe)
fuente
El nombre de su base de datos debe terminar con .db y sus cadenas de consulta deben tener un terminador (;)
fuente
Vuelva a verificar su consulta en su clase DatabaseHandler / DatabaseManager (cualquiera que haya tomado)
fuente
En mi caso, obtengo elementos del archivo XML con
<string-array>
, donde almaceno<item>
s. En estos<item>
s sostengo cadenas SQL y aplico una por una condatabaseBuilder.addMigrations(migration)
. Cometí un error, olvidé agregar\
antes de la cita y obtuve la excepción:android.database.sqlite.SQLiteException: no existe esa columna: some_value (code 1 SQLITE_ERROR):, mientras compila: INSERT INTO table_name (id, name) VALUES (1, some_value)
Entonces, esta es una variante correcta:
fuente
El método de Sqliteopenhelper tiene métodos para crear y actualizar, crear se usa cuando se crea una tabla por primera vez y se llamará al método de actualización cada vez que se cambie el número de columna de la tabla.
fuente