¿Qué desencadena SqliteDbOpenHelper onUpgrade ()?

¿Puede alguien explicar cómo se llama la función onUpgrade dentro de la clase SqliteDbOpenHelper. Estoy abriendo mi base de datos pero no está llamando al onUpgrade aunque he cambiado la DB_VERSION.

Vea el código siguiente:

public class DbHelper extends SQLiteOpenHelper { private static final String TAG = "DbHelper"; static final String DB_NAME = "caddata.sqlite"; static final int DB_VERSION = 4; private static String DB_PATH = ""; private Context myContext; private SQLiteDatabase myDataBase; public DbHelper(Context context) { super(context, DB_NAME, null, DB_VERSION); this.myContext = context; DB_PATH = "/data/data/" + context.getApplicationContext().getPackageName() + "/databases/"; } public DbHelper open() throws SQLException { myDataBase = getWritableDatabase(); Log.d(TAG, "DbHelper Opening Version: " + this.myDataBase.getVersion()); return this; } @Override public synchronized void close() { if (myDataBase != null) myDataBase.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) { Log.d(TAG, "onCreate called"); try { createDataBase(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if ( newVersion > oldVersion) { Log.d(TAG, "New database version exists for upgrade."); try { Log.d(TAG, "Copying database..."); copyDataBase(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (!dbExist) { try { copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); } } openDataBaseForRead(); } private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { String myPath = DB_PATH + DB_NAME; checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS); Log.d(TAG, "db exists"); } catch (SQLiteException e) { // database does't exist yet. Log.d(TAG, "db doesn't exist"); } if (checkDB != null) { checkDB.close(); } return checkDB != null ? true : false; } private void copyDataBase() throws IOException { // Open your local db as the input stream InputStream myInput = myContext.getAssets().open(DB_NAME); // Path to the just created empty db String outFileName = DB_PATH + DB_NAME; // Open the empty db as the output stream OutputStream myOutput = new FileOutputStream(outFileName); // transfer bytes from the inputfile to the outputfile byte[] buffer = new byte[2048]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } // Close the streams myOutput.flush(); myOutput.close(); myInput.close(); myDataBase.setVersion(DB_VERSION); } public void openDataBaseForRead() throws SQLException { // Open the database String myPath = DB_PATH + DB_NAME; myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } public void openDataBaseForWrite() throws SQLException { // Open the database String myPath = DB_PATH + DB_NAME; myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE | SQLiteDatabase.NO_LOCALIZED_COLLATORS ); } } 

También vea mi pregunta detallada aquí: ¿Por qué onUpgrade () no se invoca en la base de datos Android sqlite? Por lo cual no recibí una respuesta.

Mi actividad principal abre la base de datos del ayudante. Era mi presunción que apenas abrir la base de datos hará que la función onUpgrade () sea llamada:

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); DbHelper myDbHelper = new DbHelper(this); try { myDbHelper.createDataBase(); } catch (IOException ioe) { throw new Error("Unable to create database"); } try { myDbHelper.openDataBaseForRead(); }catch(SQLException sqle){ throw sqle; } } 

(Actualizado después del comentario de Chris) La lógica pura sugiere que DB debe actualizarse cada vez que se abra con una versión mayor. Nunca he comprobado este caso, pero hasta donde yo sé, onUpgrade() siempre se invoca durante la actualización de la aplicación cuando se ha cambiado la versión de la base de datos.

En mi opinión, la función onCreate() y onUpgrade() funcionan sólo cuando se abre una base de datos with the SQLiteOpenHelper . Que significa que debe llamar a la función getWritableDatabase() o getReadbleDatabase() para abrir la base de datos y, a continuación, tal vez puede funcionar normalmente.

Los archivos de base de datos SQLlite tienen una versión interna #. Si la API intenta abrir un archivo existente y la versión es menor que la especificada, onUpgrade se llama para que pueda manejarla.

  • ¿Cómo insertar un registro SQLite con una fecha y hora establecida en 'ahora' en la aplicación de Android?
  • Android: La tabla no tiene ninguna columna llamada "nombre de variable" MySql Error de base de datos
  • ¿Es Sqlite Database thread de instancia seguro
  • ¿El yieldIfContendedSafely () pierde los beneficios de una transacción?
  • La concurrencia de webview de Android causó SQLiteException: la base de datos está bloqueada
  • ¿Cómo se comprueba si existe una tabla en una base de datos SQLite de Android?
  • cláusula multiple where en android
  • SQLite "INSERT OR REPLACE INTO" no funciona
  • SQLiteException no se captura
  • Cómo almacenar y recuperar una matriz de bytes (datos de imagen) ay desde una base de datos SQLite?
  • ¿Por qué los Cursores Android comienzan antes de la primera fila de resultados y terminan después de la última fila?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.