Ho avuto successo con la creazione di una classe base astratta con il nome del database/istruzione create e altre informazioni condivise e quindi estendendola per ogni tabella. In questo modo, posso tenere separati tutti i miei metodi CRUD (cosa che preferisco di gran lunga). L'unico aspetto negativo è che le istruzioni DATABASE_CREATE devono risiedere nella classe genitore e devono includere tutte le tabelle, perché non è possibile aggiungere nuove tabelle in seguito, ma secondo me è un piccolo prezzo da pagare per mantenere il CRUD metodi per ogni tabella separati.
Farlo è stato abbastanza semplice, ma ecco alcune note:
- L'istruzione create nella classe genitore deve essere suddiviso per ogni tabella, perché db.execSQL non può eseguire più di un'istruzione.
- Ho cambiato tutte le var/metodi private in protetto, per ogni evenienza.
- Se stai aggiungendo tabelle a un'applicazione esistente (non sono sicuro che sia specifica per l'emulatore), l'applicazione deve essere disinstallata e quindi reinstallata.
Ecco il codice per la mia classe genitore astratta, che era basata sul Tutorial Blocco note. I bambini semplicemente estendono questo, chiamando il costruttore del super (sentiti libero di usarlo):
package com.pheide.trainose;
import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
public abstract class AbstractDbAdapter {
protected static final String TAG = "TrainOseDbAdapter";
protected DatabaseHelper mDbHelper;
protected SQLiteDatabase mDb;
protected static final String TABLE_CREATE_ROUTES =
"create table routes (_id integer primary key autoincrement, "
+ "source text not null, destination text not null);";
protected static final String TABLE_CREATE_TIMETABLES =
"create table timetables (_id integer primary key autoincrement, "
+ "route_id integer, depart text not null, arrive text not null, "
+ "train text not null);";
protected static final String DATABASE_NAME = "data";
protected static final int DATABASE_VERSION = 2;
protected final Context mCtx;
protected static class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(TABLE_CREATE_ROUTES);
db.execSQL(TABLE_CREATE_TIMETABLES);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", which will destroy all old data");
db.execSQL("DROP TABLE IF EXISTS routes");
onCreate(db);
}
}
public AbstractDbAdapter(Context ctx) {
this.mCtx = ctx;
}
public AbstractDbAdapter open() throws SQLException {
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
return this;
}
public void close() {
mDbHelper.close();
}
}
Una spiegazione leggermente più dettagliata è disponibile qui:http://pheide.com/page/11/tab/24#post13