Je lisais le tutoriel Android SQLite NotePad qui faisait référence à la création d'une classe DB Adapter pour créer et accéder à une table DB. Dans le cas d'une base de données SQLite à plusieurs tables, est-il préférable de créer une classe d'adaptateur différente pour chaque table ou de créer une classe d'adaptateur DB unique pour l'ensemble de l'application Android ?
Mon application utilise plusieurs tables et j'espérais ne pas avoir à avoir une seule classe d'adaptateur massive. Le problème, cependant, est que j'ai une sous-classe imbriquée de SQLiteOpenHelper selon l'exemple NotePad dans chaque adaptateur. Lorsque l'on accède à la première table, tout fonctionne bien. Lorsque j'essaie ensuite d'accéder à la deuxième table (à partir d'une activité différente), mon application se bloque.
Au début, je pensais que le plantage était dû à un problème de version, mais les deux adaptateurs ont maintenant la même version de base de données et le plantage persiste.
Voici un exemple de l'un des adaptateurs DB pour la table. Les autres adaptateurs suivent tous le même format avec des implémentations différentes.
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$
}
}
Lorsque l'on accède au premier adaptateur, dans ce cas usersinfo, tout fonctionne comme prévu. Disons que j'ai un autre adaptateur pour les informations sur les amis qui suit la même structure que ci-dessus, lorsqu'il est accédé par une activité différente, il me semble que la sous-classe imbriquée de SQLiteOpenHelper devrait essayer de créer la base de données à nouveau. Il est évident que quelque chose ne va pas, car dans ce scénario, mon application se plante.
Est-ce que la pratique standard dans Android est de créer un seul adaptateur de base de données mammouth au lieu d'adaptateurs individuels par table ?