varias usar una tutorial tablas studio relacionar proyectos propia para nuestra hacer fichero español datos crear consultas con como acceder android database sqlite class-design

usar - sqlite android tutorial español



Android: ¿puedo usar una clase SQLiteOpenHelper para múltiples archivos de bases de datos? (2)

Mi aplicación usa dos bases de datos (archivos separados). Para manejar estas bases de datos, he creado dos clases de Ayuda que extienden SQLiteOpenHelper, una para cada base de datos.

Ahora voy a agregar una tercera base de datos y me pregunto si necesito crear otra clase de Ayuda (y si utilicé una 4ta y una 5ta base de datos necesitaría aún más clases de Ayuda), o puedo usar la misma clase de Ayuda para múltiples bases de datos?

El problema que veo al tratar de usar solo una clase de Ayuda es que no puedo ver cómo pasar el nombre de los archivos individuales de la base de datos al Ayudante. En la actualidad, el nombre de la base de datos está codificado como un campo Estático de cada una de las clases de Ayuda, pero si tuviera solo una clase de Ayudante tendría que poder pasar los diferentes nombres al Constructor al crear el Ayudante por separado. objetos; el problema es que el Constructor SQLiteOpenHelper parece ser llamado por Android con solo un parámetro: el Contexto.


Necesita una clase abstracta que implemente el proceso de actualización que se describe aquí. Luego extiende esta clase abstracta para cada una de sus tablas. En su clase abstracta, debe almacenar sus tablas de una manera (lista, codificada) de modo que cuando la OnUpgrade active iterar sobre los elementos de la tabla y para cada elemento de la tabla, realice los pasos descritos. Se actualizarán automáticamente, manteniendo todos sus detalles existentes. Tenga en cuenta que el evento onUpgrade solo se activa una vez por cada base de datos, por eso debe iterar sobre todas sus tablas para realizar la actualización de todas ellas. Mantiene solo 1 número de versión en toda la base de datos.

  • comenzarTransacción
  • ejecutar una creación de tabla con if not exists (estamos haciendo una actualización, por lo que la tabla puede no existir aún, no podrá alterar y soltar)
  • poner en una lista las columnas existentes List<String> columns = DBUtils.GetColumns(db, TableName);
  • tabla de respaldo (tabla ALTER table " + TableName + " RENAME TO ''temp_" + TableName )
  • crear una nueva tabla (el esquema de creación de tabla más nuevo)
  • obtener la intersección con las columnas nuevas, esta vez columnas tomadas de la tabla actualizada ( columns.retainAll(DBUtils.GetColumns(db, TableName)); )
  • restaurar datos ( String cols = StringUtils.join(columns, ","); db.execSQL(String.format( "INSERT INTO %s (%s) SELECT %s from temp_%s", TableName, cols, cols, TableName)); )
  • eliminar la tabla de respaldo ( DROP table ''temp_" + TableName )
  • setTransactionSuccessful

(Esto no maneja la degradación de la tabla, si cambia el nombre de una columna, no obtiene los datos existentes transferidos ya que los nombres de las columnas no coinciden).

.

public static List<String> GetColumns(SQLiteDatabase db, String tableName) { List<String> ar = null; Cursor c = null; try { c = db.rawQuery("select * from " + tableName + " limit 1", null); if (c != null) { ar = new ArrayList<String>(Arrays.asList(c.getColumnNames())); } } catch (Exception e) { Log.v(tableName, e.getMessage(), e); e.printStackTrace(); } finally { if (c != null) c.close(); } return ar; } public static String join(List<String> list, String delim) { StringBuilder buf = new StringBuilder(); int num = list.size(); for (int i = 0; i < num; i++) { if (i != 0) buf.append(delim); buf.append((String) list.get(i)); } return buf.toString(); }


Por supuesto que puede. Es solo una cuestión de su diseño de clase Helper. Simplemente puede pasar el nombre de DB a su constructor de clase Helper (junto con la instancia de Context requerida) en lugar de hardcoding:

public class DBOpenHelper extends SQLiteOpenHelper { public DBOpenHelper(Context context, String dbName, int dbVersion) { super(context, dbName, null, dbVersion); } ... }