Pode manter o nome da classe DbAdapter,prq ele vai ser o responsavel por criar as tabelas quando necessário. E como eu disse ,vai dar erro ,mas é só vc adaptar o código.
Na ClienteDao nos métodos que retornam um curso muda para que retorne um objeto do dominio que no caso do ClienteDAO é um Cliente, ou uma List no caso do getTodosClientes.
Como faz isso:
“Na ClienteDao nos métodos que retornam um curso muda para que retorne um objeto do dominio que no caso do ClienteDAO é um Cliente, ou uma List no caso do getTodosClientes.”
Não entendi isso:
“Na ClienteDao nos métodos que retornam um curso muda para que retorne um objeto do dominio que no caso do ClienteDAO é um Cliente, ou uma List no caso do getTodosClientes.”
Eu posso criar um pacote DAO e um VO onde no VO eu gero os getters e setters dos campos da tabela, correto? Uma duvida. Como mostraria os dados cadastrados assim que clicasse no botão salvar?
Na classe DAO faria a criação das tabelas. Teria que ter uma para criar o banco somente?
ClienteDAO e ClienteVO
CarroDAO e CarroVO
e assim por diante?
Certo,cria os VO para cada entidade. As tabelas não precisam ser criadas nos DAOs ,pode manter a criação do banco e das tabelas no seu DbAdapter.
Para mostrar os dados cadastrados você pode criar uma Activity só para mostrar esses dados, logo você criaria uma intent ,onde vc passaria os dados que vc deseja mostrar nessa nova activity . Olha aqui: http://www.vogella.com/articles/AndroidIntent/article.html
Deixa ver se entendi.
Na Classe DBAdapter eu coloco somente a parte de criação das tabelas, como está no post, certo?
Na Classe DAO tiro do DBAdapter os métodos de insert, update, delete e select e coloco na Classe DAO. Pode ser uma DAO para todas as tabelas?
Cria um dao para cada entidade,pois fica mais flexível para dar manutenção no código e utiliza o seu DbAdapter para realizar essas operações internamente.
Exemplo:
ClienteDao clienteDao = new ClienteDao(context);
List<ClienteVO> clientes = clienteDao.getTodosClientes();
for(ClienteVO cliente : clientes){
log.i("clientes",cliente.getNome());
}
Entendeu o funcionamento? Em nenhum momento eu precisei me preocupar como isso vai ser implementado internamente, eu apenos instâncio o dao e passo o context que é necessário para o dbAdapter que está dentro do dao,e o dbAdapter cria um SQLiteDatabase que será responsável pela realização das operações do no banco. Seu código fica mais abstrato, permitindo que seja diminuída a complexidade que é realizar operações com banco de dados,pois o dao encapsula tudo para você.
Então faço um DAO pra cada tabela (entidade)
Clientes:
ClienteDao clienteDao = new ClienteDao(context);
List<ClienteVO> clientes = clienteDao.getTodosClientes();
for(ClienteVO cliente : clientes){
log.i("clientes",cliente.getNome());
}
Carros:
CarroDao carroDao = new CarroDao(context);
List<CarroVO> clientes = carroDao.getTodosClientes();
for(CarroVO carro : carros){
log.i("carros",carro.getNome());
}
TipoCarro:
TipoCarroDao tipocarroDao = new TipoCarroDao(context);
List<TipoCarroVO> clientes = tipocarroDao.getTodosClientes();
for(TipoCarroVO tipo : tipos){
log.i("tipos",tipo.getNome());
}
Servicos:
ServicoDao servicoDao = new ServicoDao(context);
List<ServicoVO> clientes = clienteDao.getTodosServicos();
for(ServicoVO servico : servicos){
log.i("servicos",servico.getNome());
}
Horarios:
HorarioDao horarioDao = new HorarioDao(context);
List<HorarioVO> clientes = horarioDao.getTodosHorarios();
for(HorarioVO horario : horario){
log.i("horarios",horario.getHorario());
}
OS
OsDao osDao = new OsDao(context);
List<OsVO> os = osDao.getTodosOs();
for(ClienteVO os : os){
log.i("os",os.getOs());
}
Seria mais ou menos isso? Esse código seria a lista, né?
Isso , ai dentro do dao você define as operações CRUD da sua entidade, é só ir adaptando para cada entidade do seu modelo de negócio.
No Adapter eu coloco somente a parte de criação das tabelas, certo?
isso
E como que chamaria as duas classes DAO e Adapter quando precisar delas?
Minha classe DbAdapter nova ficaria assim:
package br.me.aqua.banco;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
public class DbAdapter {
private static final String DATABASE_NAME = "bancoaqua";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_TABLE_CLIENTES = "clientes";
private static final String DATABASE_TABLE_CARROS = "carros";
private static final String DATABASE_TABLE_TIPO_CARRO = "tipo_carro";
private static final String DATABASE_TABLE_SERVICOS = "servicos";
private static final String DATABASE_TABLE_HORARIOS = "horarios";
private static final String DATABASE_TABLE_OS = "os";
// CAMPOS DA TABELA CLIENTES
public static final String KEY_ID_CLI = "_id";
public static final String KEY_NOME = "nome";
public static final String KEY_ENDERECO = "endereco";
public static final String KEY_TELEFONE = "telefone";
public static final String KEY_CELULAR = "celular";
public static final String KEY_EMAIL = "email";
// CAMPOS DA TABELA CARROS
public static final String KEY_ID_CARRO = "_id";
public static final String KEY_IDCLIENTE_CARRO = "id_cliente";
public static final String KEY_IDTIPO_CARRO = "id_tipo_carro";
public static final String KEY_MODELO = "car_modelo";
public static final String KEY_PLACA = "car_placa";
// CAMPOS DA TABELA TIPO_CARRO
public static final String KEY_ID_TIP = "_id";
public static final String KEY_TIPDESC = "tip_descricao";
// CAMPOS DA TABELA SERVICOS
public static final String KEY_ID_SER = "_id";
public static final String KEY_IDTIPO_SER = "id_tipo_carro";
public static final String KEY_DESCRICAO_SER = "ser_descricao";
public static final String KEY_VALOR = "ser_valor";
// CAMPOS DA TABELA HORARIOS
public static final String KEY_ID_HOR = "_id";
public static final String KEY_HORARIO = "hor_horario";
// CAMPOS DA TABELA OS
public static final String KEY_ID_OS = "_id";
public static final String KEY_IDCLIENTE_OS = "id_cliente";
public static final String KEY_IDSERVICO_OS = "id_servico";
public static final String KEY_IDHORARIO_OS = "id_horario";
public static final String KEY_DATA = "os_data";
// CRIA A TABELA CLIENTES
private static final String DATABASE_CREATE_CLIENTES = "create table " + DATABASE_TABLE_CLIENTES + " ("
+ KEY_ID_CLI + " integer primary key autoincrement, "
+ KEY_NOME + " text, "
+ KEY_ENDERECO + " text, "
+ KEY_TELEFONE + " text, "
+ KEY_CELULAR + " text, "
+ KEY_EMAIL + " text);";
// CRIA A TABELA CARROS
private static final String DATABASE_CREATE_CARROS = "create table " + DATABASE_TABLE_CARROS + " ("
+ KEY_ID_CARRO + " integer primary key autoincrement, "
+ KEY_IDCLIENTE_CARRO + " integer, "
+ KEY_IDTIPO_CARRO + " integer, "
+ KEY_MODELO + " text, "
+ KEY_PLACA + " text, FOREIGN KEY ( " + KEY_IDCLIENTE_CARRO
+ " ) REFERENCES " + DATABASE_TABLE_CLIENTES + " (" + KEY_ID_CLI
+ " ) ON DELETE RESTRICT ON UPDATE CASCADE , FOREIGN KEY ( "
+ KEY_IDTIPO_CARRO + " ) REFERENCES " + DATABASE_TABLE_TIPO_CARRO + " ("
+ KEY_IDTIPO_CARRO + " ) ON DELETE RESTRICT ON UPDATE CASCADE);";
// CRIA A TABELA TIPO_CARRO
private static final String DATABASE_CREATE_TIPO_CARRO = "create table " + DATABASE_TABLE_TIPO_CARRO + " ("
+ KEY_ID_TIP + " integer primary key autoincrement, "
+ KEY_TIPDESC + " text);";
// CRIA A TABELA SERVICOS
private static final String DATABASE_CREATE_SERVICOS = "create table " + DATABASE_TABLE_SERVICOS + " ("
+ KEY_ID_SER + " integer primary key autoincrement, "
+ KEY_IDTIPO_SER + " integer, "
+ KEY_DESCRICAO_SER + " text, "
+ KEY_VALOR + " text, FOREIGN KEY ( " + KEY_IDTIPO_SER
+ " ) REFERENCES " + DATABASE_TABLE_TIPO_CARRO + " (" + KEY_IDTIPO_SER
+ " ) ON DELETE RESTRICT ON UPDATE CASCADE);";
// CRIA A TABELA HORARIOS
private static final String DATABASE_CREATE_HORARIOS = "create table " + DATABASE_TABLE_HORARIOS + " ("
+ KEY_ID_HOR + " integer primary key autoincrement, "
+ KEY_HORARIO + " text);";
// CRIA A TABELA OS
private static final String DATABASE_CREATE_OS = "create table " + DATABASE_TABLE_OS + " ("
+ KEY_ID_OS + " integer primary key autoincrement, "
+ KEY_IDCLIENTE_OS + " integer, "
+ KEY_IDSERVICO_OS + " integer, "
+ KEY_IDHORARIO_OS + " integer ,"
+ KEY_MODELO + " text, "
+ KEY_PLACA + " text, FOREIGN KEY ( " + KEY_IDCLIENTE_OS
+ " ) REFERENCES " + DATABASE_TABLE_CLIENTES + " (" + KEY_ID_CLI
+ " ) ON DELETE RESTRICT ON UPDATE CASCADE, FOREIGN KEY ( "
+ KEY_IDSERVICO_OS + " ) REFERENCES "
+ DATABASE_TABLE_SERVICOS + " (" + KEY_IDSERVICO_OS
+ " ) ON DELETE RESTRICT ON UPDATE CASCADE, FOREIGN KEY ( "
+ KEY_IDHORARIO_OS + " ) REFERENCES " + DATABASE_TABLE_HORARIOS + " ("
+ KEY_IDHORARIO_OS + " ) ON DELETE RESTRICT ON UPDATE CASCADE);";
private final Context mCtx;
private DatabaseHelper mDbHelper;
private SQLiteDatabase mDb;
public DbAdapter(Context ctx){
this.mCtx = ctx;
}
public DbAdapter open() throws SQLiteException{
if(isClosed()){
mDbHelper = new DatabaseHelper(mCtx);
mDb = mDbHelper.getWritableDatabase();
}
return this;
}
public void close(){
mDbHelper.close();
}
public boolean isClosed(){
return mDb == null || !mDb.isOpen();
}
private class DatabaseHelper extends SQLiteOpenHelper{
public DatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE_CLIENTES);
db.execSQL(DATABASE_CREATE_CARROS);
db.execSQL(DATABASE_CREATE_TIPO_CARRO);
db.execSQL(DATABASE_CREATE_SERVICOS);
db.execSQL(DATABASE_CREATE_HORARIOS);
db.execSQL(DATABASE_CREATE_OS);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
}
Ficaria assim minha nova DBAdapter?
isso.
Ramon, obrigado, vc está me ajudando muito. Só uma pergunta, teria outro jeito mais prático de gerar as tabelas?
Eu já vi algumas abordagem como criar o banco em um editor externo,como sqliteStudio,empacotar ele dentro da aplicação e depois fazer uma referência à ele dentro da aplicação. Talvez vc poderia criar um arquivo de texto dentro da aplicação que mantenha o sql de criação das tabelas e depois chamar ele dentro do seu Adapter do banco, mas eu nunca tentei nenhuma dessas abordagens.
Vixe, do jeito que tá vc recomenda o uso?
Cara, a maioria das aplicações usa esse esquema de gerar dentro do helper , confesso que é meio estranho http://developer.android.com/guide/topics/data/data-storage.html#db, mas segue o padrão da guides lines do android.
Ramon, poderia me ajudar a montar as classes DAO?