Você só precisa de um auxiliar de banco de dados para todas as tabelas em um banco de dados e, portanto, usaria o onCreate método para a criação das tabelas. Observando que se você tivesse vários auxiliares de banco de dados que o onCreate (e onUpdate método) seria chamado apenas uma vez pelo primeiro auxiliar que abrisse o banco de dados e, portanto, além de ter vários auxiliares sendo ineficientes, poderia ser mais complicado ter vários auxiliares de banco de dados.
Mais especificamente onCreate só é chamado automaticamente quando o banco de dados não existe. Quando onCreate é chamado o próprio banco de dados foi criado.
na atualização é chamado apenas quando ao abrir o banco de dados, o número da versão passado para a chamada (via super chamada) é maior que o número da versão armazenado no arquivo do banco de dados. O número da versão armazenado no arquivo, neste momento, é atualizado para refletir a versão mais recente. Portanto, as chamadas subsequentes não invocarão o onUpgrade método.
Se você divide ou não os métodos e identificadores, como os nomes de coluna/tabela para tabelas individuais, é uma escolha que você pode fazer. Alguns podem achar estranho dividir outros podem pensar que é mais claro.
Exemplo
O código a seguir é um exemplo de 3 permutações (e também bancos de dados) que utilizam 2 tabelas, a saber table001 (colunas _id e meus dados ) e tabela001 (nomes das colunas _id e meusoutrosdados ).
-
usa um único databaseHelper (DBHelper001) com tudo embutido no auxiliar. O banco de dados é mydb001
-
usa um único databasehelper (DBHelper002) com os métodos e constantes específicos da tabela em classes orientadas a tabelas específicas (classe Table001 e classe Table002).
-
usa dois auxiliares de banco de dados separados (DBHelperTable001 e DBHelperTable002) e, para simplificar o código, utiliza as classes Table001 e Table002.
- Observe que para superar o onCreate sendo chamado apenas uma vez no onOpen também tenta criar a respectiva tabela (
CREATE TABLE IF NOT EXISTS ......
sendo importante neste caso evitar uma falha quando a tabela existe de fato). - Observe que esta é apenas uma ineficiência de ter vários auxiliares.
- Observe que para superar o onCreate sendo chamado apenas uma vez no onOpen também tenta criar a respectiva tabela (
Primeiro as classes específicas da tabela (não usadas pela primeira permutação)
Tabela001.java
public class Table001 {
public static final String TBL_TABLE001 = "table001";
public static final String COL_TABLE001_ID = BaseColumns._ID;
public static final String COL_TABLE001_MYDATA = "mydata";
public static String getCrtSQL() {
return "CREATE TABLE IF NOT EXISTS " + TBL_TABLE001 + "(" +
COL_TABLE001_ID + " INTEGER PRIMARY KEY, " +
COL_TABLE001_MYDATA + " TEXT" +
")";
}
public static long insert(SQLiteDatabase db, String mydata) {
ContentValues cv = new ContentValues();
cv.put(COL_TABLE001_MYDATA,mydata);
return db.insert(TBL_TABLE001,null,cv);
}
public static Cursor getAll(SQLiteDatabase db) {
return db.query(TBL_TABLE001,null,null,null,null,null,null);
}
}
Tabela002.java
public class Table002 {
public static final String TBL_TABLE002 = "table002";
public static final String COL_TABLE002_ID = BaseColumns._ID;
public static final String COL_TABLE002_MYOTHERDATA = "myotherdata";
public static String getCrtSQL() {
return "CREATE TABLE IF NOT EXISTS " + TBL_TABLE002 + "(" +
COL_TABLE002_ID + " INTEGER PRIMARY KEY, " +
COL_TABLE002_MYOTHERDATA + " TEXT" +
")";
}
public static long insert(SQLiteDatabase db, String mydata) {
ContentValues cv = new ContentValues();
cv.put(COL_TABLE002_MYOTHERDATA,mydata);
return db.insert(TBL_TABLE002,null,cv);
}
public static Cursor getAll(SQLiteDatabase db) {
return db.query(TBL_TABLE002,null,null,null,null,null,null);
}
}
As quatro classes auxiliares de banco de dados
DBHelper001.java - (autocontido)
public class DBHelper001 extends SQLiteOpenHelper {
public static final String DBNAME = "mydb001";
public static final int DBVERSION = 1;
public static final String TBL_TABLE001 = "table001";
public static final String TBL_TABLE002 = "table002";
public static final String COL_TABLE001_ID = BaseColumns._ID;
public static final String COL_TABLE001_MYDATA = "mydata";
public static final String COL_TABLE002_ID = BaseColumns._ID;
public static final String COL_TABLE002_MYOTHERDATA = "myotherdata";
public DBHelper001(Context context) {
super(context, DBNAME, null, DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String crt_table001_sql = "CREATE TABLE IF NOT EXISTS " + TBL_TABLE001 + "(" +
COL_TABLE001_ID + " INTEGER PRIMARY KEY," +
COL_TABLE001_MYDATA + " TEXT" +
")";
String crt_table002_sql = "CREATE TABLE IF NOT EXISTS " + TBL_TABLE002 + "(" +
COL_TABLE002_ID + " INTEGER PRIMARY KEY," +
COL_TABLE002_MYOTHERDATA + " TEXT" +
")";
db.execSQL(crt_table001_sql);
db.execSQL(crt_table002_sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public long insertIntoTable001(String mydata) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COL_TABLE001_MYDATA,mydata);
return db.insert(TBL_TABLE001,null,cv);
}
public long insertIntoTable002(String myotherdata) {
SQLiteDatabase db = this.getWritableDatabase();
ContentValues cv = new ContentValues();
cv.put(COL_TABLE002_MYOTHERDATA,myotherdata);
return db.insert(TBL_TABLE002,null,cv);
}
public Cursor getAllFromTable001() {
SQLiteDatabase db = this.getWritableDatabase();
return db.query(TBL_TABLE001,null,null,null,null,null,null);
}
public Cursor getAllFromTable002() {
SQLiteDatabase db = this.getWritableDatabase();
return db.query(TBL_TABLE002,null,null,null,null,null,null);
}
}
DBHelper002.java (código específico da tabela em outro lugar)
public class DBHelper002 extends SQLiteOpenHelper {
public static final String DBNAME = "mydb002";
public static final int DBVERSION = 1;
public DBHelper002(Context context) {
super(context, DBNAME, null, DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(Table001.getCrtSQL());
db.execSQL(Table002.getCrtSQL());
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
DBHelperTable001.java (auxiliar específico da tabela001)
public class DBHelperTable001 extends SQLiteOpenHelper {
public static final String DBNAME = "mydb003";
public static final int DBVERSION = 1;
public DBHelperTable001(Context context) {
super(context, DBNAME, null, DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(Table001.getCrtSQL());
//NOTE Table002 won't get created as onCreate is only called once
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
db.execSQL(Table001.getCrtSQL());
}
}
- Observação o aoAbrir é utilizado para evitar que onCreate seja invocado apenas uma vez durante o tempo de vida do banco de dados.
- invocar o execSQL é um exemplo de ineficiência dessa metodologia.
DBHelperTable002.java (auxiliar específico da tabela002)
public class DBHelperTable002 extends SQLiteOpenHelper {
public static final String DBNAME = "mydb003";
public static final int DBVERSION = 1;
public DBHelperTable002(Context context) {
super(context, DBNAME, null, DBVERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(Table002.getCrtSQL());
//NOTE Table001 won't get created as onCreate is only called once
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
db.execSQL(Table002.getCrtSQL());
}
}
Amarrando todos juntos
A atividade a seguir utiliza (MainActivity.java ) utiliza todas as 3 permutações. Para cada uma, uma linha é adicionada a cada tabela e, em seguida, todos os dados de cada tabela são extraídos para um cursor que é então despejado (saída para o log).
Observe que para os auxiliares específicos da tabela cada auxiliar é usado para extrair linhas (mostrando o aspecto de redundância).
MainActivity.java
public class MainActivity extends AppCompatActivity {
DBHelper001 mDBHlpr1;
DBHelper002 mDBHlpr2;
DBHelperTable001 mTblDBHlpr1;
DBHelperTable002 mTblDBHlpr2;
Cursor mCsr;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDBHlpr1 = new DBHelper001(this);
mDBHlpr1.insertIntoTable001("my data for table001 in mydb001");
mDBHlpr1.insertIntoTable002("my other data for table002 in mydb001");
mCsr = mDBHlpr1.getAllFromTable001();
DatabaseUtils.dumpCursor(mCsr);
mCsr = mDBHlpr1.getAllFromTable002();
DatabaseUtils.dumpCursor(mCsr);
mDBHlpr2 = new DBHelper002(this);
Table001.insert(mDBHlpr2.getWritableDatabase(),"my data for table001 in mydb002");
Table002.insert(mDBHlpr2.getWritableDatabase(),"my other data for table002 in mydb002");
mCsr = Table001.getAll(mDBHlpr2.getWritableDatabase());
DatabaseUtils.dumpCursor(mCsr);
mCsr = Table002.getAll(mDBHlpr2.getWritableDatabase());
DatabaseUtils.dumpCursor(mCsr);
//Oooops???? wouldn't normally do this
mCsr = Table001.getAll(mDBHlpr1.getWritableDatabase()); //?????????? from other database!!!
DatabaseUtils.dumpCursor(mCsr);
mTblDBHlpr1 = new DBHelperTable001(this);
Table001.insert(mTblDBHlpr1.getWritableDatabase(),"my data for table001 in mydb003");
mTblDBHlpr2 = new DBHelperTable002(this);
Table002.insert(mTblDBHlpr2.getWritableDatabase(),"my data for table002 in mydb003");
mCsr = Table001.getAll(mTblDBHlpr1.getWritableDatabase());
DatabaseUtils.dumpCursor(mCsr);
mCsr = Table002.getAll(mTblDBHlpr1.getWritableDatabase()); //???????????? but OK
DatabaseUtils.dumpCursor(mCsr);
mCsr = Table001.getAll(mTblDBHlpr2.getWritableDatabase());
DatabaseUtils.dumpCursor(mCsr);
mCsr = Table002.getAll(mTblDBHlpr2.getWritableDatabase()); //??????????? but OK
DatabaseUtils.dumpCursor(mCsr);
}
}
Resultado
O seguinte é o resultado da primeira execução (observe a execução várias vezes sem desinstalar o aplicativo resultará na adição de 2 novas linhas):-
03-06 11:27:18.453 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected] 03-06 11:27:18.453 11093-11093/? I/System.out: 0 { 03-06 11:27:18.453 11093-11093/? I/System.out: _id=1 03-06 11:27:18.453 11093-11093/? I/System.out: mydata=my data for table001 in mydb001 03-06 11:27:18.453 11093-11093/? I/System.out: } 03-06 11:27:18.453 11093-11093/? I/System.out: <<<<< 03-06 11:27:18.453 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected] 03-06 11:27:18.453 11093-11093/? I/System.out: 0 { 03-06 11:27:18.453 11093-11093/? I/System.out: _id=1 03-06 11:27:18.453 11093-11093/? I/System.out: myotherdata=my other data for table002 in mydb001 03-06 11:27:18.453 11093-11093/? I/System.out: } 03-06 11:27:18.453 11093-11093/? I/System.out: <<<<< 03-06 11:27:18.472 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected] 03-06 11:27:18.472 11093-11093/? I/System.out: 0 { 03-06 11:27:18.472 11093-11093/? I/System.out: _id=1 03-06 11:27:18.472 11093-11093/? I/System.out: mydata=my data for table001 in mydb002 03-06 11:27:18.472 11093-11093/? I/System.out: } 03-06 11:27:18.472 11093-11093/? I/System.out: <<<<< 03-06 11:27:18.472 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected] 03-06 11:27:18.473 11093-11093/? I/System.out: 0 { 03-06 11:27:18.473 11093-11093/? I/System.out: _id=1 03-06 11:27:18.473 11093-11093/? I/System.out: myotherdata=my other data for table002 in mydb002 03-06 11:27:18.473 11093-11093/? I/System.out: } 03-06 11:27:18.473 11093-11093/? I/System.out: <<<<< 03-06 11:27:18.473 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected] 03-06 11:27:18.473 11093-11093/? I/System.out: 0 { 03-06 11:27:18.473 11093-11093/? I/System.out: _id=1 03-06 11:27:18.473 11093-11093/? I/System.out: mydata=my data for table001 in mydb001 03-06 11:27:18.473 11093-11093/? I/System.out: } 03-06 11:27:18.473 11093-11093/? I/System.out: <<<<< 03-06 11:27:18.499 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected] 03-06 11:27:18.500 11093-11093/? I/System.out: 0 { 03-06 11:27:18.500 11093-11093/? I/System.out: _id=1 03-06 11:27:18.500 11093-11093/? I/System.out: mydata=my data for table001 in mydb003 03-06 11:27:18.500 11093-11093/? I/System.out: } 03-06 11:27:18.500 11093-11093/? I/System.out: <<<<< 03-06 11:27:18.500 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected] 03-06 11:27:18.500 11093-11093/? I/System.out: 0 { 03-06 11:27:18.501 11093-11093/? I/System.out: _id=1 03-06 11:27:18.501 11093-11093/? I/System.out: myotherdata=my data for table002 in mydb003 03-06 11:27:18.501 11093-11093/? I/System.out: } 03-06 11:27:18.501 11093-11093/? I/System.out: <<<<< 03-06 11:27:18.501 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected] 03-06 11:27:18.501 11093-11093/? I/System.out: 0 { 03-06 11:27:18.501 11093-11093/? I/System.out: _id=1 03-06 11:27:18.501 11093-11093/? I/System.out: mydata=my data for table001 in mydb003 03-06 11:27:18.501 11093-11093/? I/System.out: } 03-06 11:27:18.502 11093-11093/? I/System.out: <<<<< 03-06 11:27:18.502 11093-11093/? I/System.out: >>>>> Dumping cursor [email protected] 03-06 11:27:18.502 11093-11093/? I/System.out: 0 { 03-06 11:27:18.502 11093-11093/? I/System.out: _id=1 03-06 11:27:18.502 11093-11093/? I/System.out: myotherdata=my data for table002 in mydb003 03-06 11:27:18.503 11093-11093/? I/System.out: } 03-06 11:27:18.503 11093-11093/? I/System.out: <<<<<