SQLITE – configuración de la versión de una nueva base de datos

He utilizado este ejemplo para crear una base de datos que copiar en una instalación nueva

Http://www.reigndesign.com/blog/using-your-own-sqlite-database-in-android-applications/

Problema que tengo ahora es que ahora he hecho algunas actualizaciones de la base de datos y asummed asummed también hago esto actualizaciones al archivo maestro dentro de la construcción para que los usuarios siempre obtener la versión más actualizada en la nueva instalación

Tengo una clase diferente que se ocupa de todas las instrucciones de la pregunta de las llamadas del db.

He establecido esta línea

private static final int DATABASE_VERSION = 5; 

En una nueva instalación ahora la base de datos se copia correctamente, pero cuando la clase de consulta llama al databasehelper nuevamente se llama al método onupgrade () y se intenta actualizar a la última versión y la aplicación se bloquea cuando se está intentando hacer actualizaciones que no se pueden hacer

Yo estaba bajo el entendimiento de que el siguiente establecer la versión de la base de datos en instalaciones nuevas o es esto mal. En caso afirmativo, ¿cómo configuro la versión de la base de datos para las nuevas instalaciones

 public DatabaseHelper(Context context) { super(context, DB_NAME, null, DATABASE_VERSION); this.context = context; } 

Sólo para completness aquí es una muestra de la onupgrade ()

 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { dbUpgrade = new DatabaseUpgrades(context); Log.d(DEBUG_TAG, "Calling onupgrade db"); Log.d(DEBUG_TAG + " : " + DatabaseHelper.class.getName(), "Upgrading database from version " + oldVersion + " to " + newVersion); if (oldVersion == 1) { Log.d(DEBUG_TAG, "Updating to Version 2"); dbUpgrade.upgradeDB2(db); oldVersion++; } } 

Pregunta qué versión es la nueva base de datos establecida en una nueva instalación y cómo se puede sobrescribir si no es la versión 5

Gracias

Esto es correcto:

 public DatabaseHelper(Context context) { super(context, DB_NAME, null, DATABASE_VERSION); /* ... */ } 

Puse debajo del código fuente de getWritableDatabase() y como ves, no llamará onUpgrade() menos que la versión en el archivo db no sea igual a la nueva versión actual que pasas en el constructor ( version != mNewVersion line). Así que su archivo de base de datos no se sobrescribe o el número de versión en su nueva base de datos es incorrecto. Compruébelo por favor.

 /** * Create and/or open a database that will be used for reading and writing. * Once opened successfully, the database is cached, so you can call this * method every time you need to write to the database. Make sure to call * {@link #close} when you no longer need it. * * <p>Errors such as bad permissions or a full disk may cause this operation * to fail, but future attempts may succeed if the problem is fixed.</p> * * @throws SQLiteException if the database cannot be opened for writing * @return a read/write database object valid until {@link #close} is called */ public synchronized SQLiteDatabase getWritableDatabase() { if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) { return mDatabase; // The database is already open for business } if (mIsInitializing) { throw new IllegalStateException("getWritableDatabase called recursively"); } // If we have a read-only database open, someone could be using it // (though they shouldn't), which would cause a lock to be held on // the file, and our attempts to open the database read-write would // fail waiting for the file lock. To prevent that, we acquire the // lock on the read-only database, which shuts out other users. boolean success = false; SQLiteDatabase db = null; if (mDatabase != null) mDatabase.lock(); try { mIsInitializing = true; if (mName == null) { db = SQLiteDatabase.create(null); } else { db = mContext.openOrCreateDatabase(mName, 0, mFactory); } int version = db.getVersion(); if (version != mNewVersion) { db.beginTransaction(); try { if (version == 0) { onCreate(db); } else { onUpgrade(db, version, mNewVersion); } db.setVersion(mNewVersion); db.setTransactionSuccessful(); } finally { db.endTransaction(); } } onOpen(db); success = true; return db; } finally { mIsInitializing = false; if (success) { if (mDatabase != null) { try { mDatabase.close(); } catch (Exception e) { } mDatabase.unlock(); } mDatabase = db; } else { if (mDatabase != null) mDatabase.unlock(); if (db != null) db.close(); } } } 

EDITAR
Puede comprobar la versión en su nuevo archivo de base de datos con la siguiente consulta:

 PRAGMA user_version; 

Debe devolver 5 en su caso.

Se obtuvo un método llamado onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) {realizar la actualización aquí. . . }

Si su está utilizando la clase de SQLiteOpenHelper entonces solamente usted puede substituir este método.

Solo crea un

 @Override public void onCreate(SQLiteDatabase db) { onUpgrade(db, 0, DATABASE_VERSION); 
  • Cursor de cierre en la base de datos SQLite explícitamente, necesarios o no necesarios?
  • Obtener datos de una base de datos vs obtener datos de un mapa hash
  • SQLiteDiskIOException: error de E / S de disco (código 3850)
  • Expulsión de desencadenamiento de SQLite para eliminar filas
  • Android - proveedores de contenido sqlite y multithreading
  • Cómo implementar la función recursiva de sqlite3 en dispositivos Android
  • Eliminar la base de datos sqlite al actualizar la nueva versión de la aplicación
  • ¿Cómo elimino una entrada de fila de tabla sqlite por cadena?
  • Mejor detección de corrupción de SQLite
  • Error de actualización de filestream de Android Sqlite singleton db
  • EditText afterTextChanged no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.