Jeg har haft succes med at skabe en abstrakt basisklasse med databasenavnet/opret-sætningen og anden delt info og derefter udvide den for hver tabel. På denne måde kan jeg holde alle mine CRUD-metoder adskilt (hvilket jeg meget foretrækker). Den eneste ulempe er, at DATABASE_CREATE-sætningen(e) skal ligge i den overordnede klasse og skal inkludere alle tabellerne, fordi nye tabeller ikke kan tilføjes efterfølgende, men efter min mening er det en lille pris at betale for at beholde CRUD. metoder for hver tabel separat.
At gøre dette var ret simpelt, men her er nogle bemærkninger:
- Opret-sætningen i den overordnede klasse skal opdeles for hver tabel, fordi db.execSQL ikke kan udføre mere end én sætning.
- Jeg ændrede alle private vars/metoder til beskyttede, for en sikkerheds skyld.
- Hvis du tilføjer tabeller til et eksisterende program (ikke sikker på, om dette er specifikt for emulatoren), skal programmet afinstalleres og derefter geninstalleres.
Her er koden til min abstrakte forældreklasse, som var baseret på Notepad Tutorial. Børnene udvider simpelthen dette ved at kalde superens konstruktør (brug gerne denne):
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();
}
}
En lidt mere detaljeret forklaring er tilgængelig her:http://pheide.com/page/11/tab/24#post13