Мне удалось создать абстрактный базовый класс с оператором name / create базы данных и другой общей информацией, а затем расширить его для каждой таблицы. Таким образом, я могу хранить все свои методы CRUD отдельно (что я предпочитаю). Единственным недостатком является то, что оператор (ы) DATABASE_CREATE должен находиться в родительском классе и должен включать все таблицы, потому что новые таблицы не могут быть добавлены впоследствии, но, по моему мнению, это небольшая цена, которую нужно платить, чтобы сохранить CRUD методы для каждой таблицы раздельные.
Сделать это было довольно просто, но вот некоторые замечания:
- Оператор create в родительском классе должен разбиваться для каждой таблицы, поскольку db.execSQL не может выполнить более одного оператора.
- Я на всякий случай изменил все частные переменные / методы на защищенные.
- Если вы добавляете таблицы в существующее приложение (не уверены, относится ли оно к эмулятору), приложение необходимо удалить, а затем переустановить.
Вот код моего абстрактного родительского класса, основанного на учебном пособии «Блокнот». Дети просто расширяют это, вызывая конструктор супер (не стесняйтесь использовать это):
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