Успях да създам абстрактен базов клас с изявлението име/създаване на базата данни и друга споделена информация и след това да го разширя за всяка таблица. По този начин мога да запазя всичките си CRUD методи отделно (което много предпочитам). Единственият недостатък е, че изразът(ите) DATABASE_CREATE трябва да се намират в родителския клас и трябва да включва всички таблици, тъй като нови таблици не могат да се добавят след това, но според мен това е малка цена, за да се запази CRUD методи за всяка таблица отделно.
Правенето на това беше сравнително лесно, но ето някои бележки:
- Изразът create в родителския клас трябва да бъде разбит за всяка таблица, тъй като db.execSQL не може да изпълни повече от един израз.
- Промених всички частни варове/методи на защитени, за всеки случай.
- Ако добавяте таблици към съществуващо приложение (не съм сигурен дали това е специфично за емулатора), приложението трябва да бъде деинсталирано и след това преинсталирано.
Ето кода за моя абстрактен родителски клас, който беше базиран на урока за Notepad. Децата просто разширяват това, извиквайки конструктора на супер (можете да използвате това):
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();
}
}
Малко по-подробно обяснение е достъпно тук:http://pheide.com/page/11/tab/24#post13