Udało mi się utworzyć abstrakcyjną klasę bazową z instrukcją nazwa/tworzenie bazy danych i innymi udostępnionymi informacjami, a następnie rozszerzyć ją dla każdej tabeli. W ten sposób mogę oddzielić wszystkie moje metody CRUD (co zdecydowanie wolę). Jedynym minusem jest to, że instrukcje DATABASE_CREATE muszą znajdować się w klasie nadrzędnej i muszą zawierać wszystkie tabele, ponieważ nowych tabel nie można później dodać, ale moim zdaniem jest to niewielka cena za utrzymanie CRUD metody dla każdej tabeli oddzielnie.
Było to dość proste, ale oto kilka uwag:
- Oświadczenie create w klasie nadrzędnej musi być podzielone dla każdej tabeli, ponieważ db.execSQL nie może wykonać więcej niż jednej instrukcji.
- Zmieniłem wszystkie prywatne zmienne/metody na chronione, na wszelki wypadek.
- Jeśli dodajesz tabele do istniejącej aplikacji (nie jesteś pewien, czy jest to specyficzne dla emulatora), aplikacja musi zostać odinstalowana, a następnie ponownie zainstalowana.
Oto kod mojej abstrakcyjnej klasy nadrzędnej, który został oparty na samouczku Notatnika. Dzieci po prostu rozszerzają to, wywołując konstruktora super (możesz użyć tego):
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();
}
}
Nieco bardziej szczegółowe wyjaśnienie jest dostępne tutaj:http://pheide.com/page/11/tab/24#post13