Ik heb succes gehad met het maken van een abstracte basisklasse met de databasenaam/create-instructie en andere gedeelde informatie, en deze vervolgens voor elke tabel uit te breiden. Op deze manier kan ik al mijn CRUD-methoden gescheiden houden (waar ik veel de voorkeur aan geef). Het enige nadeel is dat de DATABASE_CREATE-instructie(s) zich in de bovenliggende klasse moeten bevinden en alle tabellen moeten bevatten, omdat nieuwe tabellen achteraf niet kunnen worden toegevoegd, maar naar mijn mening is dat een kleine prijs om te betalen om de CRUD te behouden methoden voor elke tabel apart.
Dit doen was vrij eenvoudig, maar hier zijn enkele opmerkingen:
- De create-instructie in de bovenliggende klasse moet voor elke tabel worden opgesplitst, omdat db.execSQL niet meer dan één instructie kan uitvoeren.
- Ik heb alle privé-vars/methoden gewijzigd in beschermd, voor het geval dat.
- Als je tabellen toevoegt aan een bestaande applicatie (niet zeker of dit specifiek voor de emulator is), moet de applicatie worden verwijderd en vervolgens opnieuw worden geïnstalleerd.
Hier is de code voor mijn abstracte bovenliggende klasse, die was gebaseerd op de Kladblok-zelfstudie. De kinderen breiden dit eenvoudig uit en noemen de constructor van de super (gebruik dit gerust):
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();
}
}
Een iets meer gedetailleerde uitleg is hier beschikbaar:http://pheide.com/page/11/tab/24#post13