¿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:
- ¿Por qué fue InsertHelper obsoleta?
- ¿Es buena idea usar las preferencias compartidas de Android para almacenar grandes cantidades de datos?
- Cómo recuperar datos de la base de datos sqlite en android y mostrarla en TextView
- Cómo puedo limitar el número de filas en la tabla SQLite de Android
- Problema de corrupción de bases de datos precargado en la aplicación de Android
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; } }
- Obtención del tipo de una columna en SQLite
- SQLite selecciona todos los registros de hoy y día anterior
- Custom ListView con la fecha como SectionHeader (Custom SimpleCursorAdapter utilizado)
- ¿Es necesario cerrar una base de datos abierta con window.openDatabase?
- ¿Estoy bebiendo la plataforma / hardware?
- SQLite es sin tipo?
- Diseño general de la aplicación (IntentService / ContentProvider / AsyncTask)
- ¿DÓNDE IN cláusula en Android sqlite?
(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.
- Android – Disposición del tablero con un fondo statelist drawable solamente para el icono
- Android sqlite delete no elimina realmente las filas