Měl jsem úspěch s vytvořením abstraktní základní třídy s příkazem název/vytvoření databáze a dalšími sdílenými informacemi a poté jsem ji rozšířil pro každou tabulku. Tímto způsobem mohu mít všechny své metody CRUD oddělené (což mnohem preferuji). Jedinou nevýhodou je, že příkaz(y) DATABASE_CREATE se musí nacházet v nadřazené třídě a musí zahrnovat všechny tabulky, protože nové tabulky nelze přidávat později, ale podle mého názoru je to malá cena, kterou musíte zaplatit za udržení CRUD. metody pro každou tabulku zvlášť.
Bylo to poměrně jednoduché, ale zde je několik poznámek:
- Příkaz create v nadřazené třídě musí být rozděleny pro každou tabulku, protože db.execSQL nemůže provést více než jeden příkaz.
- Pro jistotu jsem změnil všechny soukromé varianty/metody na chráněné.
- Pokud přidáváte tabulky do existující aplikace (nejste si jisti, zda je to specifické pro emulátor), je nutné aplikaci odinstalovat a poté znovu nainstalovat.
Zde je kód pro mou abstraktní nadřazenou třídu, která byla založena na kurzu Poznámkový blok. Děti to jednoduše rozšíří a zavolají superův konstruktor (klidně použijte toto):
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();
}
}
Trochu podrobnější vysvětlení je k dispozici zde:http://pheide.com/page/11/tab/24#post13