Saltar al contenido

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

Esta es el arreglo más exacta que te podemos compartir, sin embargo mírala detenidamente y valora si se puede adaptar a tu trabajo.

Solución:

SQLiteOpenHelperonCreate() y onUpgrade() las devoluciones de llamada se invocan cuando la base de datos se abre realmente, por ejemplo, mediante una llamada a getWritableDatabase(). 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 el int argumento pasado al constructor. En el archivo de la base de datos, el número de versión se almacena en PRAGMA user_version.

onCreate() solo se ejecuta cuando el archivo de base de datos no existía y se acaba de crear. Si onCreate() devuelve correctamente (no lanza una excepción), se supone que la base de datos se creó con el número de versión solicitado. Como consecuencia, no debes coger SQLExceptionpecado onCreate() tú mismo.

onUpgrade() solo 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. los onUpgrade() 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:

  1. Elimine el archivo de base de datos anterior para que onCreate() se ejecuta de nuevo. A menudo, esto se prefiere en el momento del desarrollo, donde usted tiene control sobre las versiones instaladas y la pérdida de datos no es un problema. Algunas formas de eliminar el archivo de la base de datos:

    • Desinstale la aplicación. Utilice el administrador de aplicaciones o adb uninstall your.package.name de la cáscara.

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

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

    • Para actualizaciones de esquema de tiempo de desarrollo donde la pérdida de datos no es un problema, puede usar execSQL("DROP TABLE IF EXISTS ") in para eliminar sus tablas existentes y llamar onCreate() para recrear la base de datos.

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

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 base de datos.

la captura es el constructor

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

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 correcta

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

La siguiente explicación explica onUpgrade caso con un ejemplo.

Digamos, su primera versión de la aplicación tenía la DatabaseHelper (extensión SQLiteOpenHelper) con el constructor pasando la versión como 1 y luego proporcionó una aplicación actualizada con el nuevo código fuente cuya versión pasó como 2, luego automáticamente cuando el DatabaseHelper está construido, la plataforma dispara onUpgrade al ver que el archivo ya existe, pero la versión es inferior a la versión actual que ha pasado.

Ahora digamos que está planeando 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 un código mejor mantenible

Ejemplo de pseudocó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);
  

Fíjate lo que falta break declaración en caso 1 y 2. Esto es lo que quiero decir con actualización incremental.

Di si la versión anterior es 2 y la nueva versión es 4, entonces la lógica actualizará la base de datos desde 2 para 3 y luego a 4

Si la versión anterior es 3 y la nueva versión es 4, solo ejecutará la lógica de actualización para 3 para 4

onCreate()

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

  2. 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).

  3. No se llamará a este método si ha cambiado su código y lo ha relanzado en el emulador. Si quieres onCreate() para ejecutar, debe usar adb para eliminar el archivo de base de datos SQLite.

onUpgrade()

  1. SQLiteOpenHelper debería llamar al superconstructor.
  2. los onUpgrade() solo se llamará al método cuando el número entero de la versión sea mayor que la versión actual que se ejecuta en la aplicación.
  3. Si quieres el onUpgrade() método para ser llamado, necesita incrementar el número de versión en su código.

Aquí puedes ver las reseñas y valoraciones de los lectores

Acuérdate de que tienes la capacidad de añadir una estimación objetiva si te ayudó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *