estaba leyendo el tutorial Bloc de notas Android SQLite que hacía referencia a la creación de una clase adaptador DB para crear y acceder a una tabla DB. Al tratar con una base de datos SQLite de múltiples tablas, ¿es una buena práctica crear una clase de adaptador diferente para cada tabla o crear una única clase de adaptador de base de datos para toda la aplicación de Android?¿Adaptador (s) DB de tabla múltiple en Android?
Mi aplicación utiliza varias tablas y esperaba no tener que tener una sola clase de adaptador masiva. el problema, sin embargo, es que tengo una subclase anidada de SQLiteOpenHelper por el ejemplo de NotePad dentro de cada adaptador. Cuando se accede a la primera tabla, todo funciona bien. Cuando intento acceder al segundo tble (de una actividad diferente) mi aplicación se cuelga.
Al principio, pensé que el accidente fue causado por un problema de versiones, pero ambos adaptadores ahora tener la misma versión de base de datos y todavía está chocando.
He aquí un ejemplo de uno de los adaptadores de base de datos para la tabla. Los otros adaptadores siguen el mismo formato con implementaciones variables.
public class InfoDBAdapter {
public static final String ROW_ID = "_id";
public static final String NAME = "name";
private static final String TAG = "InfoDbAdapter";
private static final String DATABASE_NAME = "myappdb";
private static final String DATABASE_TABLE = "usersinfo";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE = "create table usersinfo (_id integer primary key autoincrement, "
+ NAME
+ " TEXT," + ");";
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
private final Context mCtx;
private static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " //$NON-NLS-1$//$NON-NLS-2$
+ newVersion + ", which will destroy all old data"); //$NON-NLS-1$
//db.execSQL("DROP TABLE IF EXISTS usersinfo"); //$NON-NLS-1$
onCreate(db);
}
}
public InfoDBAdapter(Context ctx) {
this.mCtx = ctx;
}
public InfoDBAdapter open() throws SQLException {
this.mDbHelper = new DatabaseHelper(this.mCtx);
this.mDb = this.mDbHelper.getWritableDatabase();
return this;
}
/**
* close return type: void
*/
public void close() {
this.mDbHelper.close();
}
public long createUser(String name) {
ContentValues initialValues = new ContentValues();
initialValues.put(NAME, name);
return this.mDb.insert(DATABASE_TABLE, null, initialValues);
}
public boolean deleteUser(long rowId) {
return this.mDb.delete(DATABASE_TABLE, ROW_ID + "=" + rowId, null) > 0; //$NON-NLS-1$
}
public Cursor fetchAllUsers() {
return this.mDb.query(DATABASE_TABLE, new String[] { ROW_ID,
NAME}, null, null, null, null, null);
}
public Cursor fetchUser(long rowId) throws SQLException {
Cursor mCursor =
this.mDb.query(true, DATABASE_TABLE, new String[] { ROW_ID, NAME}, ROW_ID + "=" + rowId, null, //$NON-NLS-1$
null, null, null, null);
if (mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
public boolean updateUser(long rowId, String name) {
ContentValues args = new ContentValues();
args.put(NAME, name);
return this.mDb
.update(DATABASE_TABLE, args, ROW_ID + "=" + rowId, null) > 0; //$NON-NLS-1$
}
}
Cuando se accede al primer adaptador, en este caso usersinfo, todo funciona como se esperaba. Digamos que tengo otro adaptador para información de amigos que sigue la misma estructura que la anterior, cuando se accede por una actividad diferente, me parece que la subclase anidada de SQLiteOpenHelper intentará crear la base de datos nuevamente. Obviamente, algo está mal porque en ese escenario, mi aplicación falla.
Así es la práctica común dentro de Android para crear un único adaptador db mamut en lugar de adaptadores individuales por mesa?
+1: he estado tratando de hacerme a la idea de esto también. Tener solo una tabla o dos, no hay problema para poner todo dentro de la misma clase de adaptador DB. Sin embargo, si el DB crece con muchas tablas, se volverá complicado. Entonces realmente me interesa si alguien puede señalar algunas mejores prácticas en esta área. – Nailuj
Aquí está la misma pregunta pero con respuestas reales: http://stackoverflow.com/questions/3684678 – jcmcbeth