android - una - ¿Debería haber un SQLiteOpenHelper para cada tabla en la base de datos?
proyectos en android studio con base de datos (3)
@TheReader tiene razón. Prefiero un solo SQLiteOpenHelper para todas las tablas, esto es lo que hago: pasar una Lista de "sqls de creación de tablas" al Constructor de la subclase SQLiteOpenHelper, luego en la función onCreate iterar la lista para crear cada tabla. así que mi subclase SQLiteOpenHelper se ve algo así:
public ModelReaderDbHelper(Context context, List<String> createSQLs, List<String> deleteSQLs){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
this.TABLE_CREATION_SQLS = createSQLs;
this.TABLE_DELETE_SQLS = deleteSQLs;
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
for(String oneCreation : TABLE_CREATION_SQLS){
sqLiteDatabase.execSQL(oneCreation);
}
}
Pero ese es otro problema: después de agregar una nueva tabla e instalar la nueva versión de la aplicación con una antigua instalada, la nueva tabla no se creará, ya que la existencia de la base de datos anterior evitará que la función onCreate sea llamado. Así que el usuario debe desinstalar la aplicación primero e instalarla por completo. DATABASE_VERSION ayuda, parece que Android no ejecutará la función onCreate si y solo si existe una base de datos con el mismo nombre y la misma DATABASE_VERSION
¿Es mejor tener una única subclase grande de SQLiteOpenHelper
que defina los métodos onCreate
y onUpgrade
para cada tabla en la base de datos, o es mejor tener muchas subclases de SQLiteOpenHelper
, una para cada tabla?
¿Hay una mejor práctica? ¿O son aceptables, pero con diferentes efectos secundarios buenos y malos?
Debe tener una sola clase SQLiteOpenHelper para todas las tablas. Revisa this enlace.
Sólo por un enfoque diferente:
Siempre se puede invalidar el onOpen(..)
se llama onCreate(..)
. Asegúrese de utilizar la declaración "CREATE TABLE IF NOT EXISTS..."
lugar de "CREATE TABLE"
@Override
public void onOpen(SQLiteDatabase db) {
onCreate(db);
}
@Override
public void onCreate(SQLiteDatabase db) {
String CREATE_FRIENDS_TABLE = "CREATE TABLE IF NOT EXISTS ...";
db.execSQL(CREATE_FRIENDS_TABLE);
}
Lo haces con cada clase que se extiende desde SQLiteOpenHelper