Montar DAO

66 respostas
F

Boa noite meus amigos,

Tenho a seguinte classe Adapter:

package br.me.aquasystem.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_VEICULO = "tipo_veiculo";
	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 DE VEICULO	
	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_VEICULO + " ("     
    + 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_VEICULO + " ("
	+ 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_VEICULO + " (" + 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();
	}

// TABELA TIPO VEÍCULO : KEY_ID_TIP, KEY_TIPDESC
	
	public Cursor getTodosTipoVeiculo(){
		return mDb.query(DATABASE_TABLE_TIPO_VEICULO, null, null, null, null, null, null);
	}

//  GRAVAR TIPO VEÍCULO
	public long gravarTipoVeiculo(String tipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_TIPDESC, tipo);
		return mDb.insert(DATABASE_TABLE_TIPO_VEICULO, null, valores);
	} 

//  APAGAR TIPO VEÍCULO
	public boolean apagarTipoVeiculo(long Id){
		int qt = mDb.delete(DATABASE_TABLE_TIPO_VEICULO, KEY_ID_TIP + "=" + Id, null);
		return qt > 0;
	}

//  ALTERAR TIPO VEÍCULO
	public boolean alterarTipoVeiculo(long Id, String tipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_TIPDESC, tipo);
		return mDb.update(DATABASE_TABLE_TIPO_VEICULO, valores, KEY_ID_TIP + "=" + Id, null) > 0;
	}	
	
//  TIPO VEÍCULO POR ID	
	public Cursor getTipoVeiculo(long Id){
		return mDb.query(DATABASE_TABLE_TIPO_VEICULO, null, KEY_ID_TIP + "=" + Id, null, null, null, null);
	}
	
// TIPO VEÍCULO POR DESCRICAO	
	public Cursor getTipoVeiculoPorDescricao(String nomeString){
		String[] selectionArgs = {nomeString + "%"};  
//		return mDb.query(DATABASE_TABLE_CLIENTES, null, KEY_NOME + "=" + selectionArgs, null, null, null, null);
		return mDb.rawQuery("SELECT * FROM tipo_veiculo WHERE tip_descricao like ?", selectionArgs);
	}
	
	
	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) {
		}
		
	}
	
}

Gostaria de separar as coisas, deixar somente no Adapter a criação do banco e tabelas e na classe TipoVeiculoDAO os métodos CRUD. Alguém me ajudar a montar?

Segue classe TipoVeiculoDAO:[color=red] [/color]

package br.me.aquasystem.banco;

public class TipoVeiculoDAO {

}

66 Respostas

F

Então, o que quero é separar o CRUD no Adapter e deixar numa nova classe somente os métodos de CRUD, TipoVeiculoDAO, e deixar no Adapter somente a criação do banco e tabelas. Gostaria de ajuda para isso. Está postado o código ai.

F

Olá fbrigatt !!

Tb tenho uma dúvida organizacional:

Como também tenho várias tabelas no meu bacno, e pra organizar a coisa, tentei fazer uma classe dao pra cada tabela (contendo essa o script de cada tabela) … mas sem sucesso …
vi no seu código que seu arquivo dao tem o script de todo o banco …
ou seja… pelo jeito tb vou ter que fazer um baita de um arquivo dao …
://

vou acompanhar aqui pra ver se é possível deixar o crud em classes diferentes … (eu até já tinha tentado isso, mas sem sucesso … vamos ver se alguém responde positivamente) …

quem vem do Java, sente falta né ? hihi …

abraço …

F

Frital,

O que vc fez que não certo? Como assim?

wellington.nogueira

Como que posso transcrever os métodos do Adapter para essa?

Segue classe TipoVeiculoDAO:

package br.me.aquasystem.banco;  
  
public class TipoVeiculoDAO {  
  
}
F

Bom, a respeito da melhor maneira organizacional podemos concluir o seguinte então ?

  • uma classe “geraBanco” que estende SQLiteOpenHelper para gerar todo o banco(script), com métodos abstratos ;
  • uma classe Dao para cada entidade (ex.: carros, pessoas, etc), onde cada classe estende à “geraBanco”, implementando seus métodos abstratos …

correto ?

Grato por antecipação …

F

Alguém ajuda?

F

Eu estou tentando, mas não estou conseguindo separar o que tenho, entendeu? Do jeito que tá, está funcionando, mas gostaria de separar as coisas, métodos CRUD na TipoVeiculosDAO e o DbAdapter, somente o código pra montar as tabelas e banco. To desde cedo tentando isso.

F

Classe Adapter

package br.me.aquasystem.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_VEICULO = "tipo_veiculo";
	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 DE VEICULO	
	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_VEICULO + " ("     
    + 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_VEICULO + " ("
	+ 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_VEICULO + " (" + 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();
	}

// TABELA TIPO VEÍCULO : KEY_ID_TIP, KEY_TIPDESC
	
	public Cursor getTodosTipoVeiculo(){
		return mDb.query(DATABASE_TABLE_TIPO_VEICULO, null, null, null, null, null, null);
	}

//  GRAVAR TIPO VEÍCULO
	public long gravarTipoVeiculo(String tipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_TIPDESC, tipo);
		return mDb.insert(DATABASE_TABLE_TIPO_VEICULO, null, valores);
	} 

//  APAGAR TIPO VEÍCULO
	public boolean apagarTipoVeiculo(long Id){
		int qt = mDb.delete(DATABASE_TABLE_TIPO_VEICULO, KEY_ID_TIP + "=" + Id, null);
		return qt > 0;
	}

//  ALTERAR TIPO VEÍCULO
	public boolean alterarTipoVeiculo(long Id, String tipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_TIPDESC, tipo);
		return mDb.update(DATABASE_TABLE_TIPO_VEICULO, valores, KEY_ID_TIP + "=" + Id, null) > 0;
	}	
	
//  TIPO VEÍCULO POR ID	
	public Cursor getTipoVeiculo(long Id){
		return mDb.query(DATABASE_TABLE_TIPO_VEICULO, null, KEY_ID_TIP + "=" + Id, null, null, null, null);
	}
	
// TIPO VEÍCULO POR DESCRICAO	
	public Cursor getTipoVeiculoPorDescricao(String nomeString){
		String[] selectionArgs = {nomeString + "%"};  
//		return mDb.query(DATABASE_TABLE_CLIENTES, null, KEY_NOME + "=" + selectionArgs, null, null, null, null);
		return mDb.rawQuery("SELECT * FROM tipo_veiculo WHERE tip_descricao like ?", selectionArgs);
	}
	
	
	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) {
		}
		
	}
	
}
import br.me.aquasystem.banco.DbAdapter;
import br.me.gridview.R;
import android.app.Activity;
import android.app.AlertDialog;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.EditText;
import android.widget.ImageButton;

public class CadastrarTipoVeiculo extends Activity { // Início da Classe CadastrarTipoVeiculo
	private long mId;
	private EditText Tipo_Veiculo;
	private ImageButton salvar, pesquisar, limpar, voltar;
	
	private DbAdapter mDb; // KEY_ID_TIP e KEY_TIPDESC
	
	@Override
	protected void onCreate(Bundle icicle){ // Início do método onCreate
		super.onCreate(icicle);
		setContentView(R.layout.cad_tipo_veiculo);
		
		mDb = new DbAdapter(this);
F

E ai, ajuda…

F

Alguém me ajuda, to com dificuldades pra adaptar o que tenho, por favor.

F

Não quero que façam por mim, quero que me ajudem, estou com essas dúvidas, pois já está pronto, é só separar.

Eu estou com duvida quanto aos imports, pq na Classe DBAdapter é onde crio o banco e as tabelas, certo?

Na classe CadastrarTipoVeiculo importo DBAdapter: import br.me.aquasystem.banco.DbAdapter; Perunta: Preciso do import br.me.aquasystem.banco.DbAdapter e private DbAdapter mDb; na classe TipoVeiculoDAO? Como faria a chamada dos métodos CRUD na CadastrarTipoVeiculo, pois estou fazendo assim: mDb.gravarTipoVeiculo(tipo_veiculoString);

F

O DBAdapter é classe pai sim, nela eu quero que fique somente a criação do banco e as tabelas. Na classe CadastrarTipoVeiculo como que encapsulo o mDB, não entendi esse metodo get protected, seria isso na classe CadastrarTipoVeiculo:

protected DbAdapter mDb;
F

logo abaixo de;

@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		}
		
	}

coloco isso?

F

Fiz assim na classe TipoVeiuculoDAO e esta dando erro na query:

Deixei assim na classe DbAdapter: public static final String DATABASE_TABLE_TIPO_VEICULO = “tipo_veiculo”;

public class TipoVeiculoDAO {

	private DbAdapter mDb;
// TABELA TIPO VEÍCULO : KEY_ID_TIP, KEY_TIPDESC
	
	public Cursor getTodosTipoVeiculo(){
		return mDb.query(mDb.DATABASE_TABLE_TIPO_VEICULO, null, null, null, null, null, null); // mDb.query ta sublinhado de vermelho
	}

Tem que tirar o mDb?

F

Está dando esse erro

Implicit super constructor DbAdapter() is undefined for default constructor. Must define an explicit constructor

Na linha:

public class TipoVeiculoDAO extends DbAdapter { //TipoVeiculoDAO está sublinhado

F

Está dando esse erro

Implicit super constructor DbAdapter() is undefined for default constructor. Must define an explicit constructor

Na linha:

public class TipoVeiculoDAO extends DbAdapter { //TipoVeiculoDAO está sublinhado

F

Entendi, obrigado pelo conselho. Vou dar uma pesquisada sobre isso. Eu já imaginava que seria o construtor da classe. Só da uma dica de como fazer isso, é melhor fazer na TipoVeiculoDAO?

F

Eu já fiz, seria isso:

public TipoVeiculoDAO(Context ctx) {
		super(ctx);
		// TODO Auto-generated constructor stub
	}
F

Erro estranho:

06-11 18:52:03.314: E/AndroidRuntime(350): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.me.gridview/br.me.aquasystem.TipoVeiculo}: java.lang.NullPointerException

Classe TipoVeiculo:

package br.me.aquasystem;

import br.me.aquasystem.banco.DbAdapter;
import br.me.aquasystem.DAO.TipoVeiculoDAO;
import br.me.gridview.R;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.View;
//import android.view.View.OnClickListener;
//import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;

public class TipoVeiculo extends ListActivity{
	
	public ImageButton btnAdicionar_TipoVeiculo;
	public DbAdapter db;
	private TipoVeiculoDAO dao;
	
	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lista_tipo_veiculo);
		
//		String[] items = new String[] {"Carro","Trabalho","Faculdade"};
		
		db = new DbAdapter(this);
		
		carregarLista();
		
		btnAdicionar_TipoVeiculo = (ImageButton) findViewById(R.id.btn_AdicionarTipoVeiculo);
		
		btnAdicionar_TipoVeiculo.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				Intent intent = new Intent(TipoVeiculo.this, CadastrarTipoVeiculo.class);
				startActivityForResult(intent, 1);
			}
		});
       }
	
	@Override
	protected void onListItemClick(ListView l, View v, int position, long id) {
		super.onListItemClick(l, v, position, id);
		Intent intent = new Intent(TipoVeiculo.this, CadastrarTipoVeiculo.class);
		intent.putExtra(DbAdapter.KEY_ID_TIP, id);
		startActivityForResult(intent, 1);
	}
	
	private void carregarLista(){
		db.open();
		Cursor tipos = dao.getTodosTipoVeiculo();
		tipos.moveToFirst();
		
		SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.two_line_list_item, tipos, new String[] {DbAdapter.KEY_ID_TIP, DbAdapter.KEY_TIPDESC},new int[] {android.R.id.text1,android.R.id.text2});
		setListAdapter(adapter);
		db.close();
	}
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		super.onActivityResult(requestCode, resultCode, data);
		if(requestCode == 1 && resultCode == RESULT_OK)
			carregarLista();
	}
	
}
F

wellington.nogueira

que erro é esse?

F

Mas qual o motivo desse erro? Onde está no código, não estou localizando.

F

Ninguém pra ajudar?

F

seria parecido com isso:

db = new DbAdapter(this);

dao = new TipoVeiculoDAO(this); // isso?

Não estou identificando onde fazer isso. Seria na classe TipoVeiculos?

F

wellington.nogueira

O que eu posso tirar o que está sobrando no código?

F

Alguém me ajuda, não estou conseguindo. Será que colocar os métodos de abertura e fechamento do banco no DAO resolve o problema? Deixar no DBAdapter somente a criação do banco?

F

Por favor, alguém poderia me dar uma luz?

F

Ninguém? Estou parado nisso, preciso de ajuda.

F

Alguém??

F

Bom, tenho acompanhado de perto esse tópico, e relato minha experiência, talvez ajude:

Após muito quebrar a cabeça pra ver como poderia organizar meu código, já que tb tenho várias tabelas, cheguei a uma das mais simples soluções:

  • Criei uma classe extendendo SQLiteOpneHelper, no qual eu crio todo o banco e tabelas;
  • E no mais, criei várias classes “dao”, onde cada uma extende à classe mencionada acima, e nas quais tenho os métodos implementados referente a cada entidade;

Ainda não é a melhor maneira, uma vez o crud é similar a inúmeras classes, portanto, poderia criar métodos abstratos… mas enfim … dessa forma já temos uma boa organização e separação dos códigos …

espero ter ajudado …
abraços …

V

Eu faço exatamente como Frital falou acima e funciona, vou postar exemplo:

public class DBHelper extends SQLiteOpenHelper {

	public static final String NOME_DO_BANCO = "banco";
	public static final int DATABASE_VERSION = 1;

	private final String SCRIPT_TABELA_CLIENTE = 	" CREATE TABLE IF NOT EXISTS CLIENTE ( " +
										" CODIGO INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY, " +
										" NOME VARCHAR(60) NOT NULL " + 
										" );"; 

	private final String SCRIPT_TABELA_FORNECEDOR = 	" CREATE TABLE IF NOT EXISTS CLIENTE ( " +
										        " CODIGO INTEGER AUTO_INCREMENT NOT NULL PRIMARY KEY, " +
										        " NOME VARCHAR(60) NOT NULL " + 
										        " );"; 

        public DBHelper(Context ctx) {
		super(ctx, NOME_DO_BANCO, null, DATABASE_VERSION);
	}

	public void onCreate(SQLiteDatabase db) {
		db.execSQL(SCRIPT_TABELA_CLIENTE);
		db.execSQL(SCRIPT_TABELA_FORNECEDOR);
        }

	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
	}
}

Uma classe por tabela, chamo de repositório, mas é o DAO rs

public class RepositorioCliente {

	private SQLiteDatabase db;
	
	private static RepositorioCliente instance = new RepositorioCliente();
	
        // para não abrir o banco toda vez
	public static RepositorioCliente getInstance(Context ctx) {
		if (instance.db == null || instance.db.isOpen()) {
			instance.db = new DBHelper(ctx).getWritableDatabase();
		}
		
		return instance;
	}

	public boolean insert(Cliente cliente) {
		boolean resultado = false;
		db.beginTransaction();
		try {
			ContentValues contentValues = new ContentValues();
			contentValues.put("CODIGO", cliente.getCodigo());
			contentValues.put("NOME", cliente.getNome());
			
			if (db.insert("CLIENTE", null, contentValues) > -1) {
				db.setTransactionSuccessful();
				resultado = true;
			}
		} finally {
			db.endTransaction();
		}
		
		return resultado;		
	}

       // outras funções (alterar, excluir, consulta)

}

Chamando na activity

Não sei se é a maneira mais correta, mas funciona rs.

F

Valerio Bezerra,

No caso, vc teria um outro Repositório chamado RepositorioFornecedor. Faria isso pra cada tabela que tenha no banco?

F

Obrigado pelo retorno Valério !
=)

Exatamente fbrigatt. Assim vc tem uma classe para cada tabela, e seu código fica extremamente organizado.

Aproveitando, estou querendo montar uns layout´s dividindo a tela de um tablet, e só tenho material impresso pra smartphone, que não aborda “fragments” …
devo estudar é isso mesmo né ? fragments ? pra poder dividir a tela né ?
=)

abraços galera …

F

Frital,

Posta aqui um exemplo de como vc utiliza, tem como?

F

Sim ! segue código exemplo:

Primeiro a classe que gera o banco (chamada DbAdapter):

public class DbAdapter extends SQLiteOpenHelper {

	private static final String NOME_BANCO = "agenda";  
    private static final int VERSAO=1;

    public DbAdapter(Context context) {  
        super(context, NOME_BANCO, null, VERSAO);  
    } 

	@Override
	public void onCreate(SQLiteDatabase db) {
		String tabela_materia = "CREATE  TABLE IF NOT EXISTS 'materia' ('id' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT , " +
				"'descricao' VARCHAR(45) NULL , 'professor' VARCHAR(45) NULL , 'nota' FLOAT NULL , 'faltas' INT NULL , " +
				"'status' VARCHAR(45) NULL); ";
		
		String tabela_atividade = "CREATE  TABLE IF NOT EXISTS 'atividade' ('id' INTEGER NOT NULL PRIMARY" +
				" KEY AUTOINCREMENT , 'titulo' VARCHAR(45) NULL , 'descricao' VARCHAR(255) NULL ," +
				" 'pontos' FLOAT NULL , 'data' DATETIME NULL , 'status' VARCHAR(45) NULL);"; 
		

		
						
        db.execSQL(tabela_materia);
        db.execSQL(tabela_atividade);

		
	}

Agora, uma classe dao no caso, chamada materia:

public class MateriaDao extends DbAdapter {

	private static final String NOME_TABELA = "materia";

	public MateriaDao(Context context) {
		super(context);
	}
public List<Materia> listarMaterias(){
		List<Materia> materias = new ArrayList<Materia>();
		Cursor c = getWritableDatabase().query(NOME_TABELA,Materia.colunasMateria,null,null,null,null,null);  
        while (c.moveToNext()){  
            Materia materia = new Materia();  
            materia.setId(c.getLong(0));
            materia.setDescricao(c.getString(1));
            materia.setProfessor(c.getString(2));
            materia.setNota(c.getFloat(3));
            materia.setFaltas(c.getLong(4));
            materia.setStatus(c.getString(5));  
            materias.add(materia);  
        }
        c.close();
        return materias;
		
	}

   }
}

e por último, a classe main(mas poderia se qualquer outra, que chama uma classe dao ..

public class Main extends Activity {

	List<Materia> materias = new ArrayList<Materia>();
	List<Dia> dias = new ArrayList<Dia>();
	
	Button btn_atividades, btn_horario, btn_notas, btn_faltas, btn_materias;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		
		verificaMaterias();
       }

 private void verificaMaterias() {
			
		 MateriaDao materiaDao = new MateriaDao(this);
		 materias = materiaDao.listarMaterias();
		 materiaDao.close();
	
	}

}

tranquilo né ?
=)

F

Sim, Frital, depois dessa aula, sim. Uma dúvida que tenho é quanto ao relacionamento entre tabelas, como fazer.

Eu faço assim:

//  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_VEICULO + " ("       
    + KEY_IDTIPO_CARRO + " ) ON DELETE RESTRICT ON UPDATE CASCADE);";

Teria um outro jeito mais fácil de fazer?

F

Sim, vc foi bastante minuncioso na estruturação de seu código …
por um acaso, pegou de algum exemplo ? ou fez vc mesmo ?
pois se fez vc mesmo, não entendo pq está com dúvida …
=)

quando vc cria tabelas relacionadas, com chaves estrangeiras, só não pode acontecer é de vc criar uma tabela que contém chave estrangeira que referencia uma chave (geralmente primária) de uma tabela que ainda não foi criada …

F

Foi eu quem fiz, rs, gostaria de saber se tem um jeito mais fácil de fazer, pq assim é meio complicado, rs. Eu fiz isso nesses programas de modelagem e que gera o script depois.

V

fbrigatt, teria sim um RepositorioFornecedor

F

ah sim … perfeito …
=)
eu sempre faço a modelagem, e depois gero o script …
pode ver que meu código está bem mais simples que o seu …

a vantagem do seu código é a facilidade visual de localizar os campos, e se vc mudar um nome de um campo, vc muda só na constante inicial, no inicio do código …
a vantagem do meu, é que não preciso fazer “nada” … hihi … e quando vou mudar um campo, vou no script e altero … tb naum tem nenhuma dificuldade …
=)

abraço …
=)

F

Como vc faz? Posta um exemplo aqui com relacionamento.

F

normal ué .. muda só a String da linha de comando da criação da tabela ué:

[quote] String TABELA_ATIVIDADE = "CREATE TABLE IF NOT EXISTS `atividade` (

`idatividade` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT ,

`materia_fk_` INT NULL ,

`titulo` VARCHAR(45) NULL ,

`descricao` VARCHAR(255) NULL ,

`pontos` FLOAT NULL ,

`data` DATETIME NULL ,

`status` VARCHAR(45) NULL ,

CONSTRAINT `materia`

FOREIGN KEY (`materia_fk_` )

REFERENCES `materia` (`idmateria` )

ON DELETE NO ACTION

ON UPDATE NO ACTION);";
[code]

F

O que está entre ‘’ seria os campos? Porque entre aspas? O meu não tem.

B

Boa noite

Dei um ctrl+c e ctrl+v e separei algumas coisas…lembrando que isto não foi testado é um quase um pseudo código do que normalmente eu faria

1º classe de conexão com SQLITE

package br.me.aquasystem.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 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();  
        }  
         
		public SQLiteDatabase getConnection(){
			return mDb;
		}
		 
        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) {  
            }  
              
        }  
          
    }

2º classe abstrata com Constantes “maneira simples”, mas prefiro criar uma classe enum…

package br.me.aquasystem.banco; 

public abstract class ConstantsBD{

        public static final String DATABASE_NAME = "bancoaqua";  
        public static final int DATABASE_VERSION = 1;  
          
        public static final String DATABASE_TABLE_CLIENTES = "clientes";  
        public static final String DATABASE_TABLE_CARROS = "carros";  
        public static final String DATABASE_TABLE_TIPO_VEICULO = "tipo_veiculo";  
        public static final String DATABASE_TABLE_SERVICOS = "servicos";  
        public static final String DATABASE_TABLE_HORARIOS = "horarios";  
        public 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 DE VEICULO      
        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  
        public 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      
        public 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_VEICULO + " ("       
        + KEY_IDTIPO_CARRO + " ) ON DELETE RESTRICT ON UPDATE CASCADE);";   
          
    //  CRIA A TABELA TIPO_CARRO  
        public static final String DATABASE_CREATE_TIPO_CARRO = "create table " + DATABASE_TABLE_TIPO_VEICULO + " ("  
        + KEY_ID_TIP + " integer primary key autoincrement, "  
        + KEY_TIPDESC + " text);";  
      
    //  CRIA A TABELA SERVICOS  
        public 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_VEICULO + " (" + KEY_IDTIPO_SER  
        + " ) ON DELETE RESTRICT ON UPDATE CASCADE);";  
          
    //  CRIA A TABELA HORARIOS  
        public 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  
        public 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);"; 

}

3º uma classe Dao p/Veiculo, o ideal é criar uma classe Bean para usar junto com a Dao

package br.me.aquasystem.banco; 

import java.util.*;
import android.content.ContentValues;  
import android.database.sqlite.SQLiteDatabase; 
import android.database.Cursor;   

public class VeiculoDao{
	
	 private DbAdapter adapter;  
	 
     public VeiculoDao(DbAdapter adapter){
		this.adapter=adapter;
	 }

    public List<Veiculos> getTodosTipoVeiculo(){  
	    List<Veiculo> veiculos=new ArrayList<Veiculo>();
	    SQLiteDatabase mDb=adapter.getConnection();
        Cursor cursor=null;
		Veiculo veiculo=null;
		
		try{
		    cursor=mDb.query(DATABASE_TABLE_TIPO_VEICULO, null, null, null, null, null, null); 
			cursor.moveToFirst()
			
			while(!cursor.moveToLast()){
				veiculo=new Veiculo();
				veiculo.setPlaca(cursor.getColumnNames(cursor.getColumnIndex("VEI_PLACA")));
				/*
				  VARRE O CURSOR SETANDO TODOS BEANS
				*/
				veiculos.add(veiculo);
			  cursor.moveToNext();
			}
			
		}catch(Exception e){
			e.printStackTrace();	
		}finally{
			if(cursor != null)
			cursor.close;
		}	

			return veiculos;
    }  

}

Quando for usar :

DbAdapter dbAdapter=new DbAdapter(this);
	VeiculoDao veiDao=new VeiculoDao(dbAdapter);
	List<Veiculo> veiculos=null;
	
	try{
		dbAdapter.open()
		veiculos=veiDao.listar();
	}catch(Exception e){
	   e.printStackTrace();
	}finally{
		 if(!dbAdapter.isClosed())
			dbAdapter.close();
	}
B

Separe tudo em camadas “pacotes”, use uma arquitetura p/desenvolver, padrões como singleton “toda classe tem a sua responsabilidade”, eu particulamente uso o MVC - Model , View , Control.

Model = Bean, Dao "onde mantem os dados e persiste"
View = Activity "tudo que for visual"
Controle = Adapters “tudo que faça controle sobre a View”

Abraço :wink:

F

Ok, mas como seria essa Classe Bean?

B

Boa noite

A classe Bean é uma entidade ou seja um objeto do mundo real,
que possui atributos que devem ter acesso atraves de métodos getters e setters “encapsulamento”.

O eclipse tem um gerador de código p/os metodos getter/setter, só é preciso escrever isto…

public class Veiculo {
	
	private String placa;
	private int    ano;
	private double chassi;
	private String marca;
	private String modelo;
 
        //coloque o cursor do teclado aqui e clique com botão direito do mouse Source > Generate Getters and Setters
}

resultado será…

public class Veiculo {
	
	private String placa;
	private int    ano;
	private double chassi;
	private String marca;
	private String modelo;
	
	public String getPlaca() {
		return placa;
	}
	public void setPlaca(String placa) {
		this.placa = placa;
	}
	public int getAno() {
		return ano;
	}
	public void setAno(int ano) {
		this.ano = ano;
	}
	public double getChassi() {
		return chassi;
	}
	public void setChassi(double chassi) {
		this.chassi = chassi;
	}
	public String getMarca() {
		return marca;
	}
	public void setMarca(String marca) {
		this.marca = marca;
	}
	public String getModelo() {
		return modelo;
	}
	public void setModelo(String modelo) {
		this.modelo = modelo;
	}
	
}

mais detallhes : http://pt.wikipedia.org/wiki/JavaBeans

F

Obrigado pelo retorno. Ok, então como ficaria todas as classes prontas com essa Bean?

V

eu separo em 4 pacotes:

. model;

. repositorio(dao);

. adpter;

. activity(view);
F

Valerio, posta aqui as classes, tem como?

B

Opa

Tenho um exemplo no GitHUb fiz um simples M.V.C: “Model,View, Control”.
O exemplo é ListView c/custom Adapter que mostra alguns países:
https://github.com/SolutionBTO/AppAndroidListView_MVC/

O botão [ZIP] vc baixa todo projeto, ou importar com url no eclipse:
http://www.yaw.com.br/screencast/show/eclipse-plugin-egit/

F

Ok, vou baixar. Esse link: http://www.yaw.com.br/screencast/show/eclipse-plugin-egit/ é pra usar no Eclipse?

Tem CRUD?

F

Uma dúvida pertinente,

Como faço os relacionamentos das tabelas no SQLite?

B

Certo.

Este link do tutorial para egit, não é framework para CRUD, é um framework p/controle de versão, com ele vc pode importar os projeto do GITHUB “repositorio web”, lá no GITHUB tem vários projetos que pode usar como parâmetro.

Enquanto a relacionamento de tabelas :http://www.sqlite.org/lang.html

F

Ok, obrigado. Então uso o link do egit?

Teria algum bd do sqlite com relacionamento para que possa pegar de modelo?

B

Não necessariamente precisa usar o egit, pode somente baixar o exemplo e importar no eclipse, na página do GITHUB tem um botão [ZIP] p/todos projetos lá.

Fiz os minhas tabelas no sqlite sem relacionamento até hoje, tb não sei como funciona , mas neste site que te passei,
tem toda documentação.

Por gentileza, se foi resolvido o lance do Montar DAO, edite seu post para [RESOLVIDO] Montar Dao, e abra outro post para resolver este lance
do relacionamento, desta maneira podera separar os assuntos e ajudar outras pessoas, com a mesma dúvida :wink:

Falow

F

Ok, tópico resolvido.

W

Primeiramente, não acho que a criação das tabelas tenha que ficar no adapter, mas sim numa classe a parte que tenha exclusivamente essa responsabilidade.

Depois, verifique quais são os métodos relacionados ao CRUD que estão no Adapter e que você quer portar para o DAO especializado (marque-os como Abstract e remova o corpo dos mesmos, terminando os métodos com ;).
Ex.: // ALTERAR TIPO VEÍCULO public boolean alterarTipoVeiculo(long Id, String tipo){ ContentValues valores = new ContentValues(); valores.put(KEY_TIPDESC, tipo); return mDb.update(DATABASE_TABLE_TIPO_VEICULO, valores, KEY_ID_TIP + "=" + Id, null) > 0; }
Mude para // ALTERAR TIPO VEÍCULO public abstract boolean alterarTipoVeiculo(long Id, String tipo);

Faça com que teu DAO especializado herde o Adapter.

Veja que, ao fazer isso apenas, não necessariamente tornou teu Adapter mais genérico. Você deve fazer uma análise de suas necessidades de modo que possa especializar mais o Adapter para ser utilizado para outros DAOs.

W

fbrigatt:
Alguém ajuda?
Você tentou fazer alguma coisa? Ou está esperando a resposta? Pois aqui já tem alguns passo-a-passos a serem seguidos.
Se o que foi respondido não é exatamente o que deseja, acredito que seja necessário você explicar melhor tua necessidade.

W

Posta onde você está instanciando e usando a DbAdapter.
Porém, poste as alterações que fez e, se possível, qual o erro está ocorrendo.

W

Estava esperando uma tentativa de alteração sua, ou seja, a DbAdapter alterada e a TipoVeiculoDAO implementada (e se houvesse erros, postasse também). Mas você postou a mesma classe DbAdapter que já tinha postado anteriormente.

Acredito que você não esteja lendo as mensagens ou mesmo tentando e apenas esperando que alguém altere para você.

W

fbrigatt:
Não quero que façam por mim, quero que me ajudem, estou com essas dúvidas, pois já está pronto, é só separar.

Eu estou com duvida quanto aos imports, pq na Classe DBAdapter é onde crio o banco e as tabelas, certo?

Na classe CadastrarTipoVeiculo importo DBAdapter: import br.me.aquasystem.banco.DbAdapter; Perunta: Preciso do import br.me.aquasystem.banco.DbAdapter e private DbAdapter mDb; na classe TipoVeiculoDAO? Como faria a chamada dos métodos CRUD na CadastrarTipoVeiculo, pois estou fazendo assim: mDb.gravarTipoVeiculo(tipo_veiculoString);


Se o DbAdapter for a classe-pai, então encapsule o mDb com método get protected (não precisa ser público pois quem tem que ter acesso são as classes-filhas) e na chamada, ao invés de usar mDb.gravarTipoVeiculo(tipo_veiculoString); usa getMDb().gravarTipoVeiculo(tipo_veiculoString);

W

Dentro de DbAdapter tem que colocar este método:

protected SQLiteDatabase getMDb() { return mDb; }
Apenas classes no mesmo pacote ou classes filhas irão enxergar este método.

W

fbrigatt:
Fiz assim na classe TipoVeiuculoDAO e esta dando erro na query:

Deixei assim na classe DbAdapter: public static final String DATABASE_TABLE_TIPO_VEICULO = “tipo_veiculo”;

public class TipoVeiculoDAO {

	private DbAdapter mDb;
// TABELA TIPO VEÍCULO : KEY_ID_TIP, KEY_TIPDESC
	
	public Cursor getTodosTipoVeiculo(){
		return mDb.query(mDb.DATABASE_TABLE_TIPO_VEICULO, null, null, null, null, null, null); // mDb.query ta sublinhado de vermelho
	}

Tem que tirar o mDb?

Na verdade, teria que ser assim:

public class TipoVeiculoDAO extends DbAdapter {

//	private DbAdapter mDb;
// TABELA TIPO VEÍCULO : KEY_ID_TIP, KEY_TIPDESC
	
	public Cursor getTodosTipoVeiculo(){
		return getMDb(). //Este método TEM que estar implementado em DbAdapter conforme eu coloquei nos posts acima.
                          query(mDb.DATABASE_TABLE_TIPO_VEICULO, null, null, null, null, null, null); // mDb.query ta sublinhado de vermelho
	}
W

fbrigatt:
Está dando esse erro

Implicit super constructor DbAdapter() is undefined for default constructor. Must define an explicit constructor

Na linha:

public class TipoVeiculoDAO extends DbAdapter { //TipoVeiculoDAO está sublinhado

Significa que DbAdapter não possui um construtor vazio, logo, ou cria um nele (não recomendado se você não sabe o que está fazendo) ou cria um construtor com os mesmos parâmetros na classe filha (TipoVeiculoDAO) e, no corpo do construtor, faz a chamada a super(parametros…).

Mas, sinceramente, acho que você está precisando revisar (ou conhecer) uma série de conceitos de programação com Java, seja para Android ou não… e você também precisa aprender a entender os erros apresentados. Este mesmo, ao invés de colocar aqui, poderia ter pesquisado no google… Digo isso para que você evite de ficar batendo a cabeça e empacado a mais de um dia com detalhes pequenos (pois não necessariamente seremos rápidos em responder sua dúvida e uma googada poderia ser mais rápida).

W

fbrigatt:
Entendi, obrigado pelo conselho. Vou dar uma pesquisada sobre isso. Eu já imaginava que seria o construtor da classe. Só da uma dica de como fazer isso, é melhor fazer na TipoVeiculoDAO?
sim.

Exemplo:

public ConstrutorClasseFilha(String param1, int param2) { super(param1, param2); //Codigo específico do construtor da classe filha se houver. }

W

fbrigatt:
wellington.nogueira

que erro é esse?


É NullPointerException

W

Significa que você está utilizando um objeto que não foi inicializado. Eu já achei no teu código qual foi o objeto não inicializado.

Como vc está tornando o DAO filho de DbAdapter, a criação desse objeto (db) passa a ser desnecessária. Porém você passou a utilizar TipoVeiculoDAO (dao) mas, você criou o objeto?

Criado 9 de junho de 2013
Ultima resposta 13 de jun. de 2013
Respostas 66
Participantes 5