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
  • Android: inserta una matriz de imágenes de mapa de bits en la base de datos SQLite
  • Manera correcta de manejar Bidireccional 1: m en Green-DAO
  • Cómo insertar a granel de Json a Sqlite en Android
  • ¿El depurador de Android trunca mensajes de depuración?
  • Cómo leer la base de datos de otra aplicación
  • Ubicación de la base de datos sqlite en el dispositivo
  • java.lang.IllegalStateException: getWritableDatabase llamado recursivamente
  • ¿Es posible acceder a la base de datos desde un servicio?
  • Conexiones de la base de datos Android y cursores oh my
  • Prácticas recomendadas para exponer varias tablas mediante proveedores de contenido en Android
  • Utilice Insertar o Reemplazar en ContentProvider
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.