Jag har haft framgång med att skapa en abstrakt basklass med databasnamnet/create-satsen och annan delad information, och sedan utöka den för varje tabell. På så sätt kan jag hålla alla mina CRUD-metoder åtskilda (vilket jag mycket föredrar). Den enda nackdelen är att DATABASE_CREATE-satsen(erna) måste finnas i den överordnade klassen, och måste inkludera alla tabellerna, eftersom nya tabeller inte kan läggas till efteråt, men enligt min mening är det ett litet pris att betala för att behålla CRUD. metoder för varje tabell separat.
Att göra detta var ganska enkelt, men här är några anteckningar:
- Skapa-satsen i den överordnade klassen måste delas upp för varje tabell, eftersom db.execSQL inte kan köra mer än en sats.
- Jag ändrade alla privata vars/metoder till skyddade, för säkerhets skull.
- Om du lägger till tabeller i ett befintligt program (osäker på om detta är specifikt för emulatorn), måste programmet avinstalleras och sedan installeras om.
Här är koden för min abstrakta föräldraklass, som baserades på Anteckningsblockhandledningen. Barnen utökar helt enkelt detta och ringer superkonstruktören (använd gärna denna):
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 lite mer detaljerad förklaring finns här:http://pheide.com/page/11/tab/24#post13