Android SQLiteAssetHelper No se puede actualizar la base de datos de sólo lectura de la versión 1 a 2:

Quiero crear una aplicación de diccionario sin conexión, que necesita a veces para obtener la actualización y la base de datos de edad será reemplazado por uno nuevo. Es lo que quiero hacer, y hice algo como esto con SQLiteAssetHelper Library:

Nota: SQLiteAssetHelper copiará la base de datos de la carpeta de activos en la carpeta de datos de la aplicación

 public class MyDb extends SQLiteAssetHelper { private static final String DATABASE_NAME = "db.sqlite"; private static final int DATABASE_VERSION = 1; public MyDb(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } } 

Ahora quiero actualizar la base de datos, después de db.sqlite nuevo archivo db.sqlite en la carpeta de assets , tengo manipular mis códigos como este:

 public class MyDb extends SQLiteAssetHelper { private static final String DATABASE_NAME = "db.sqlite"; private static final int DATABASE_VERSION = 2; public MyDb(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } } 

Pero cuando i compilado y ejecutado, dice: No se puede actualizar la base de datos de sólo lectura de la versión 1 a 2

¿cuál es la solución?

Al borrar los datos de la aplicación, funcionará bien …

PERDÓN POR MI MAL INGLES…

4 Solutions collect form web for “Android SQLiteAssetHelper No se puede actualizar la base de datos de sólo lectura de la versión 1 a 2:”

Citando la documentación :

Si tiene una base de datos de sólo lectura o no se preocupa por la pérdida de datos de usuario, puede forzar a los usuarios a la versión más reciente de la base de datos SQLite cada vez que se incremente el número de versión (sobrescribiendo la base de datos local con la de los activos) El método setForcedUpgrade() en su constructor de subclases SQLiteAsstHelper .

Además, puede pasar un argumento que es el número de versión por debajo del cual se va a forzar la actualización.

Tenga en cuenta que esto sobrescribirá una base de datos local existente y todos los datos dentro de ella.

No está llamando a setForcedUpgrade() de su constructor.

Debe llamar a setForcedUpgrade(); Después de su Constructor :

 public class MyDb extends SQLiteAssetHelper { private static final int DATABASE_VERSION = 2;//+1 public MyDb(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); setForcedUpgrade(); } } 

Se resuelve por esto:

  @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion != newVersion) { context.deleteDatabase(DATABASE_NAME); new MyDb(context); }else super.onUpgrade(db, oldVersion, newVersion); } 

Es muy útil para alguna base de datos que no necesitamos datos antiguos al obtener la actualización.

Tenga en cuenta que la eliminación del db antiguo y la creación de uno nuevo en onUpgrade no es la solución correcta. Los datos antiguos tienen que ser migrados. Incase usted no está interesado en el mantenimiento de datos antiguos ov versión 1, está bien.

La forma correcta es usar onUpgrade para modificar el esquema. La mayor parte del tiempo alterando el esquema requería recrear la tabla. En estos casos siga el siguiente enfoque

  1. Cambiar el nombre de la tabla existente (digamos table_xyz) para ser alterado a algún nombre temporal (digamos temp_table_xyz)
  2. Cree la tabla (table_xyz) con un nuevo esquema
  3. Copie el contenido de la tabla temporal temp_table_xyz al nuevo table_xyz
  • Excepción no manipulada org.json.jsonexception
  • Base de datos SQLite de Android, ¿POR QUÉ caída de tabla y volver a crear en la actualización
  • HTML5 SQLite vs Base de datos nativa en caso de PhoneGap
  • Android: cómo consultar SQLiteDatabase con args de selección de no-cadena?
  • Android - SQLite - SELECCIONAR ENTRE Fecha1 Y Fecha2
  • Almacenar valores dobles en SQLite: ¿cómo asegurar la precisión?
  • SQLite Context.MODE_PRIVATE
  • Extraño SQLiteException no en todos los dispositivos
  • Tratar con WHERE IN (?) En la consulta de SQLite de SQL
  • Cambiar el nombre de SQLite Database
  • ArrayAdapter: debe proporcionar un id de recurso para una vista de texto
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.