¿Cuándo se ejecuta SQLiteOpenHelper onCreate () / onUpgrade ()?

Creo 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.) Intento de proporcionar una "canónica" comunidad wiki pregunta / respuesta aquí para que todas esas preguntas se pueden dirigir a una buena referencia.)

SQLiteOpenHelper onCreate() SQLiteOpenHelper onCreate() y onUpgrade() se invocan cuando se abre la base de datos, por ejemplo, mediante una llamada a getWritableDatabase() . La base de datos no se abre cuando se crea el propio objeto auxiliar de base de datos.

SQLiteOpenHelper versiones de los archivos de base de datos. El número de versión es el argumento int que se pasa al constructor . En el archivo de base de datos, el número de versión se almacena en PRAGMA user_version .

onCreate() sólo se ejecuta cuando el archivo de base de datos no existe y se acaba de crear. Si onCreate() devuelve correctamente (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 debe captar SQLException s en onCreate() usted mismo.

onUpgrade() sólo se llama cuando existe el archivo de base de datos pero el número de versión almacenado es menor que el solicitado en el constructor. El onUpgrade() debe actualizar el esquema de 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 se actualiza. Dos enfoques principales:

  1. Elimine el archivo de base de datos antiguo para que onCreate() se ejecute de nuevo. Esto se prefiere a menudo en el momento del desarrollo en el que tiene control sobre las versiones instaladas y la pérdida de datos no es un problema. Algunas maneras de eliminar el archivo de base de datos:

    • Desinstale la aplicación. Utilice el administrador de aplicaciones o adb uninstall your.package.name desde shell.

    • Borrar los datos de la aplicación. Utilice el administrador de aplicaciones.

  2. Incrementar la versión de la base de datos para que se onUpgrade() . Esto es un poco más complicado, ya que se necesita más código.

    • Para las actualizaciones de esquema de tiempo de desarrollo donde la pérdida de datos no es un problema, sólo puede utilizar execSQL("DROP TABLE IF EXISTS <tablename>") para quitar las tablas existentes y llamar a onCreate() para recrear la base de datos.

    • Para las versiones liberadas, debe implementar la migración de datos en onUpgrade() para que sus usuarios no pierdan sus datos.

Para añadir más puntos aquí faltantes, según la solicitud de Jaskey

La versión de base de datos se almacena en el archivo de SQLite datos SQLite .

Catch es el constructor

 SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) 

Así, cuando el constructor de ayuda de la base de datos se llama con un name (segundo parámetro), la plataforma comprueba 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 base de datos y activa la llamada correcta

Como ya se explicó en la respuesta anterior, si la base de datos con el nombre no existe, desencadena onCreate .

A continuación explicación explica onUpgrade caso con un ejemplo.

Digamos que la primera versión de la aplicación tenía el DatabaseHelper (extendiendo SQLiteOpenHelper ) con el constructor pasando la versión como 1 y luego proporcionó una aplicación actualizada con el nuevo código fuente con la versión pasada como 2 , y luego automáticamente cuando se construye DatabaseHelper Viendo que el archivo ya existe, pero la versión es más baja que la versión actual que ha pasado.

Ahora diga que está planeando dar una tercera versión de la aplicación con la versión de db como 3 (la versión de db se incrementa sólo cuando se va a modificar el esquema de la base de datos). En estas actualizaciones incrementales, tiene que escribir la lógica de actualización de cada versión de forma incremental para obtener un código mejorable

Ejemplo pseudo-código a continuación:

 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch(oldVersion) { case 1: //upgrade logic from version 1 to 2 case 2: //upgrade logic from version 2 to 3 case 3: //upgrade logic from version 3 to 4 break; default: throw new IllegalStateException( "onUpgrade() with unknown oldVersion " + oldVersion); } } 

Observe la instrucción de break faltante en el caso 1 y 2 . Esto es lo que quiero decir con una actualización incremental.

Decir si la versión antigua es 2 y la nueva versión es 4 , entonces la lógica actualizará la base de datos de 2 a 3 y luego a 4

Si la versión anterior es 3 y la nueva versión es 4 , sólo se ejecutará la lógica de actualización de 3 a 4

onCreate()

  1. Cuando creamos DataBase en una primera vez (es decir, la base de datos no existe) onCreate() crear base de datos con la versión que se pasa en SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

  2. onCreate() está creando las tablas que ha definido y ejecutando cualquier otro código que haya escrito. Sin embargo, este método sólo se llamará si el archivo SQLite falta en el directorio de datos de su aplicación ( /data/data/your.apps.classpath/databases ).

  3. Este método no se llamará si ha cambiado el código y vuelto a iniciar en el emulador. Si desea que onCreate() ejecute necesita utilizar adb para eliminar el archivo de base de datos SQLite.

onUpgrade()

  1. SQLiteOpenHelper debe llamar al super constructor.
  2. El método onUpgrade() sólo se llamará cuando el entero de la versión sea mayor que la versión actual que se ejecuta en la aplicación.
  3. Si desea que se onUpgrade() al método onUpgrade() , debe incrementar el número de versión en su código.

Puntos a recordar al extender SQLiteOpenHelper

  1. super(context, DBName, null, DBversion); – Debe invocarse la primera línea del constructor
  2. onCreate y onUpgrade (si es necesario)
  3. onCreate se invocará sólo cuando se getWritableDatabase() o getReadableDatabase() . Y esto sólo se invocará una vez cuando un DBName especificado en el primer paso no está disponible. Puede agregar la consulta create table en el método onCreate
  4. Siempre que quieras agregar una nueva tabla cambia DBversion y haz las consultas en la tabla onUpgrade o simplemente desinstala, luego instala la aplicación.

Desinstale la aplicación del emulador o del dispositivo. Ejecute la aplicación de nuevo. (OnCreate () no se ejecuta cuando ya existe la base de datos)

Puede ser que sea demasiado tarde pero quisiera compartir mi respuesta corta y dulce. Compruebe Respuesta para el mismo problema. Definitivamente le ayudará. No más especificaciones profundas.

Si está seguro acerca de la sintaxis para la creación de tabla, que puede suceder cuando agrega nueva columna en su misma tabla, para eso …

1) Desinstale de su dispositivo y ejecútelo de nuevo.

O

2) Configuración -> aplicación -> ClearData

O

3) Cambiar DATABASE_VERSION en su clase "DatabaseHandler" (Si ha agregado nueva columna de la que se actualizará automáticamente)

 public DatabaseHandler(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } 

O

4) Cambiar DATABASE_NAME en su clase "DatabaseHandler" (me enfrenté al mismo problema, pero logré cambiar DATABASE_NAME .)

Puede crear bases de datos y tablas como

 public class DbHelper extends SQLiteOpenHelper { private static final String DBNAME = "testdatbase.db"; private static final int VERSION = 1; public DbHelper(Context context) { super(context, DBNAME, null, VERSION); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase db) { // TODO Auto-generated method stub db.execSQL("create table BookDb(id integer primary key autoincrement,BookName text,Author text,IssuedOn text,DueDate text,Fine text,Totalfine text"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXISTS BookDb"); onCreate(db); } } 

Nota: si desea crear otra tabla o agregar columnas o no, simplemente incremente la VERSION

No se encuentra esa tabla principalmente cuando no ha abierto la clase SQLiteOpenHelper con getwritabledata() y antes de esto también tiene que llamar a make constructor con databasename & version. Y OnUpgrade se llama cuando hay valor de actualización en el número de versión dado en la clase SQLiteOpenHelper .

A continuación, se muestra el fragmento de código (no se ha encontrado ninguna columna de este tipo como resultado del hechizo en el nombre de la columna):

 public class database_db { entry_data endb; String file_name="Record.db"; SQLiteDatabase sq; public database_db(Context c) { endb=new entry_data(c, file_name, null, 8); } public database_db open() { sq=endb.getWritableDatabase(); return this; } public Cursor getdata(String table) { return sq.query(table, null, null, null, null, null, null); } public long insert_data(String table,ContentValues value) { return sq.insert(table, null, value); } public void close() { sq.close(); } public void delete(String table) { sq.delete(table,null,null); } } class entry_data extends SQLiteOpenHelper { public entry_data(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); // TODO Auto-generated constructor stub } @Override public void onCreate(SQLiteDatabase sqdb) { // TODO Auto-generated method stub sqdb.execSQL("CREATE TABLE IF NOT EXISTS 'YOUR_TABLE_NAME'(Column_1 text not null,Column_2 text not null);"); } public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { onCreate(db); } } 

El nombre de su base de datos debe terminar con .db también sus cadenas de consulta deben tener un terminador (;)

El método de Sqliteopenhelper tiene métodos crear y actualizar, create se utiliza cuando se crea una tabla por primera vez y el método de actualización se llamará cada vez que cambie el número de columna de la tabla.

  • Cómo insertar a granel en sqlite en android
  • Implementación correcta de la base de datos Android asíncrona de SQLite
  • ¿Cómo puedo actualizar un valor de columna de la base de datos android sqlite a null usando ContentValues?
  • ¿Cómo implementar deshacer un solo paso para los cambios en la base de datos SQLite?
  • Sincronización local de SQLite con Firebase
  • Actualización de la imagen del perfil del usuario
  • Uso de la palabra clave IN en android sqlite
  • Android ExpandableListActivity y SimpleCursorTreeAdapter?
  • ¿Cuándo debo guardar datos en SQLite ingresados ​​en un fragmento en mi aplicación de Android?
  • Cómo seleccionar datos entre dos intervalos de fechas en android SQLite
  • Datetime ('ahora') da tiempo equivocado
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.