Eu tive sucesso ao criar uma classe base abstrata com a instrução name/create do banco de dados e outras informações compartilhadas e, em seguida, estendê-la para todas as tabelas. Dessa forma, posso manter todos os meus métodos CRUD separados (o que eu prefiro). A única desvantagem é que a(s) instrução(ões) DATABASE_CREATE devem residir na classe pai e devem incluir todas as tabelas, porque novas tabelas não podem ser adicionadas posteriormente, mas na minha opinião esse é um pequeno preço a pagar para manter o CRUD métodos para cada tabela separadamente.
Fazer isso foi bastante simples, mas aqui estão algumas notas:
- A instrução create na classe pai deve ser dividido para cada tabela, porque db.execSQL não pode executar mais de uma instrução.
- Alterei todas as variáveis/métodos privados para protegidos, por precaução.
- Se você estiver adicionando tabelas a um aplicativo existente (não tenho certeza se isso é específico do emulador), o aplicativo deverá ser desinstalado e reinstalado.
Aqui está o código para minha classe pai abstrata, que foi baseada no Tutorial do Bloco de Notas. Os filhos simplesmente estendem isso, chamando o construtor do super (sinta-se à vontade para usar isso):
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();
}
}
Uma explicação um pouco mais detalhada está disponível aqui:http://pheide.com/page/11/tab/24#post13