Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


La base de datos Sqlite onUpgrade () no se llama

Estoy trabajando en una aplicación de Android donde he utilizado base de datos sqlite existente en la carpeta de activos. Así que realmente copiar la base de datos de esa carpeta. El usuario también puede guardar sus propios datos (marque cualquier contenido como favorito).

He subido una versión en el mercado. Ahora quiero añadir algunos datos nuevos en la base de datos y subir una nueva versión. Si el usuario actualiza la aplicación desde el mercado quiero guardar los datos de usuario (de la versión anterior) y agregar los nuevos datos también. He hecho algunos google y encontró que en el método de actualización debe hacer el truco. Pero estoy cambiando el DATABASE_VERSION de código, pero el método de actualización no recibe llamada. Me pregunto que he perdido algo. Aquí está mi código:

public class DataBaseHelper extends SQLiteOpenHelper { private static String DB_PATH = "/data/data/riskycoder.login/databases/"; public static String DB_NAME = "datenbank_EN.sqlite"; private SQLiteDatabase myDataBase; private final Context myContext; private static final int DATABASE_VERSION = 1; public DataBaseHelper(Context context) { super(context, DB_NAME, null, DATABASE_VERSION); this.myContext = context; } public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (dbExist) { } else { this.getWritableDatabase(); try { this.close(); copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); } } } private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { String myPath = DB_PATH + DB_NAME; checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE); } catch (SQLiteException e) { } if (checkDB != null) checkDB.close(); return checkDB != null ? true : false; } private void copyDataBase() throws IOException { InputStream myInput = myContext.getAssets().open(DB_NAME); String outFileName = DB_PATH + DB_NAME; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[2048]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); //myDataBase.setVersion(DATABASE_VERSION); } public void openDataBase() throws SQLException { String myPath = DB_PATH + DB_NAME; myDataBase = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READWRITE); Log.d("Test", "Database version: " +myDataBase.getVersion()); } @Override public synchronized void close() { if (myDataBase != null) myDataBase.close(); super.close(); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.d("Test", "in onUpgrade. Old is: " + oldVersion + " New is: " + newVersion); } 

}

  • Cómo ignorar el acento en la consulta SQLite (Android)
  • ¿Es Parse.com un servicio adecuado para la copia de seguridad / sincronización con SQLite en Android?
  • Eliminar todas las filas de una tabla, lanza nullpointer
  • Cómo almacenar datos en la base de datos sqlite con jQuery-mobile dreamviewer cc con phonegap en android?
  • ¿Puede un proyecto de biblioteca de Android tener su propia base de datos SQLite?
  • Android: utiliza UUID como clave principal en SQLite
  • Actualizar Recyclerview de otra actividad
  • Cómo establecer una columna como indexador único en Sqlite
  • 4 Solutions collect form web for “La base de datos Sqlite onUpgrade () no se llama”

    onUpgrade() sólo se llama si se detecta un cambio en el número de versión de la base de datos. Incrementar la versión de base de datos como sigue:

     private static final int DATABASE_VERSION = 2; 

    Cambie su onUpgrade a lo siguiente

     @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(newVersion > oldVersion){ myContext.deleteDatabase(DB_NAME); } } 

    Y también cambiar su createDataBase () como a continuación,

     public void createDataBase() throws IOException{ boolean dbExist = checkDataBase(); if(dbExist){ // By calling this method here onUpgrade will be called on a // writable database, but only if the version number has been increased this.getWritableDatabase(); } dbExist = checkDataBase(); if(!dbExist){ //By calling this method an empty database will be created into the default system path //of the application so we will be able to overwrite that database with our database. this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); } } } 

    Al final, aumente la versión de la base de datos y ejecútela de nuevo. onUpgrade no recibe llamadas hasta que llama a getReadableDatabase() o funciones similares.

    Espero que esto ayude

    Pruebe esto (aumente la DATABASE_VERSION) y se llamará onUpdate ():

     private static final int DATABASE_VERSION = 2; 

    Suponiendo que cambiaste la DATABASE_VERSION, todavía tienes que poner código en onUpgrade para que esto suceda. No es mágico, tienes que decirle qué hacer.

    En su caso usted necesita:

    1) copiar la base de datos antigua (darle un nuevo nombre)
    2) copia en su nueva base de datos
    3) leer los datos de la antigua base de datos
    4) copiar cualquier diferencia en la nueva base de datos
    5) eliminar la base de datos antigua

    EDITAR

    Suponiendo que envíe el DB en la carpeta de activos que se copia para su uso de la siguiente manera:

     @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // First copy old db InputStream bakInput = getActivity().getAssets().open(dbname); String bakFileName = getActivity().getAssets() + "YourDB.old"; OutputStream bakOutput = new FileOutputStream(bakFileName); byte[] buffer = new byte[1024]; int length; while ((length = bakInput.read(buffer)) > 0) { bakOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); // delete the old db File delDB = new File(getActivity().getAssets() + "YourDB"); boolean deleted = file.delete(); // Copy in the new db InputStream myInput = getActivity().getAssets().open("YourDB"); String outFileName = MAIN_DB_PATH + dbname; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } myOutput.flush(); myOutput.close(); myInput.close(); // add code here to get changes user has made to db and move them to updated db // delete the old db copy File delDB = new File(getActivity().getAssets() + "YourDB.old"); boolean deleted = file.delete(); } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.