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:
SQLiteOpenHelperonCreate()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.SQLiteOpenHelperversiones de los archivos de la base de datos. El número de versión es elintargumento 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 atraparteSQLExceptionenonCreate()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.namedesde 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), seonUpgradeactivará 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
SQLitearchivo 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
onUpgradecaso 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ón1y luego proporcionó una aplicación actualizada con el nuevo código fuente que tenía la versión aprobada2, y automáticamente cuandoDatabaseHelperse construye, la plataforma se disparaonUpgradeal 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
breakdeclaración que falta en el caso1y2. Esto es lo que quiero decir con actualización incremental.Decir si la versión antigua es
2y nuevas versiones4, entonces la lógica se actualice la base de datos a partir2de3y después de4Si la versión antigua es
3y nuevas versiones4, se acaba de ejecutar la lógica de actualización para3a4fuente
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()SQLiteOpenHelperdeberí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_VERSIONen su clase "DatabaseHandler" (si ha agregado una nueva columna, se actualizará automáticamente)O
4) Cambie
DATABASE_NAMEen su clase "DatabaseHandler" (me enfrenté al mismo problema. Pero tengo éxito al cambiarDATABASE_NAME).fuente
Puntos para recordar al extender
SQLiteOpenHelpersuper(context, DBName, null, DBversion);- Se debe invocar la primera línea del constructor.onCreateyonUpgrade(si es necesario)onCreatese invocará solo cuandogetWritableDatabase()ogetReadableDatabase()se ejecute. Y esto solo se invocará una vez cuando unDBNameespecificado en el primer paso no esté disponible. Puede agregar crear tabla de consulta en elonCreatemétodoDBversiony realice las consultas en laonUpgradetabla 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
SQLiteOpenHelperclase congetwritabledata()y antes de esto también debe llamar a make constructor con databasename & version. YOnUpgradese llama cada vez que hay un valor de actualización en el número de versión dado en laSQLiteOpenHelperclase.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