Erro ao cadastrar

62 respostas
F

Pessoal, alguém poderia me ajudar, não estou conseguindo identificar o erro.

Classe DbAdapter

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_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 CLIENTES: KEY_ID_CLI, KEY_NOME, KEY_ENDERECO, KEY_TELEFONE, KEY_CELULAR, KEY_EMAIL
	
//  GRAVAR CLIENTE
	public long gravarCliente(String nome, String endereco, String telefone, String celular, String email){
		ContentValues valores = new ContentValues();
		valores.put(KEY_NOME, nome);
		valores.put(KEY_ENDERECO, endereco);
		valores.put(KEY_TELEFONE, telefone);
		valores.put(KEY_CELULAR, celular);
		valores.put(KEY_EMAIL, email);
		return mDb.insert(DATABASE_TABLE_CLIENTES, null, valores);
	}

//  ALTERAR CLIENTE
	public boolean atualizarCliente(long Id, String nome, String endereco, String telefone, String celular, String email){
		ContentValues valores = new ContentValues();
		valores.put(KEY_NOME, nome);
		valores.put(KEY_ENDERECO, endereco);
		valores.put(KEY_TELEFONE, telefone);
		valores.put(KEY_CELULAR, celular);
		valores.put(KEY_EMAIL, email);
		return mDb.update(DATABASE_TABLE_CLIENTES, valores, KEY_ID_CLI + "=" + Id, null) > 0;
	}

//  APAGAR CLIENTE
	public boolean apagarCliente(long Id){
		int qt = mDb.delete(DATABASE_TABLE_CLIENTES, KEY_ID_CLI + "=" + Id, null);
		return qt > 0;
	}

// TABELA TIPO CARRO : KEY_ID_TIP, KEY_TIPDESC
	
//  GRAVAR TIPO CARRO
	public long gravarTipoCarro(String tipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_TIPDESC, tipo);
		return mDb.insert(DATABASE_TABLE_TIPO_CARRO, null, valores);
	}

//  ALTERAR TIPO CARRO
	public boolean atualizarTipoCarro(long Id, String tipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_TIPDESC, tipo);
		return mDb.update(DATABASE_TABLE_TIPO_CARRO, valores, KEY_ID_TIP + "=" + Id, null) > 0;
	}

//  APAGAR TIPO CARRO
	public boolean apagarTipoCarro(long Id){
		int qt = mDb.delete(DATABASE_TABLE_TIPO_CARRO, KEY_ID_TIP + "=" + Id, null);
		return qt > 0;
	}
	
// TABELA CARROS: KEY_ID_CARRO, KEY_IDCLIENTE_CARRO, KEY_IDTIPO_CARRO, KEY_MODELO, KEY_PLACA
	
// GRAVAR CARRO
	public long gravarCarroCliente(String modelo, String placa, String idcliente, String idtipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_IDCLIENTE_CARRO, Integer.valueOf(idcliente.trim()));
		valores.put(KEY_IDTIPO_CARRO, Integer.valueOf(idtipo.trim()));
		valores.put(KEY_MODELO, modelo);
		valores.put(KEY_PLACA, placa);
		return mDb.insert(DATABASE_TABLE_CARROS, null, valores);
	}

//  ALTERAR CARRO
	public boolean atualizarCarro(long Id, String modelo, String placa, String idcliente, String idtipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_IDCLIENTE_CARRO, Integer.valueOf(idcliente.trim()));
		valores.put(KEY_IDTIPO_CARRO, Integer.valueOf(idtipo.trim()));
		valores.put(KEY_MODELO, modelo);
		valores.put(KEY_PLACA, placa);
		return mDb.update(DATABASE_TABLE_CARROS, valores, KEY_ID_CLI + "=" + Id, null) > 0;
	}

//  APAGAR CARRO
	public boolean apagarCarro(long Id){
		int qt = mDb.delete(DATABASE_TABLE_CARROS, KEY_ID_CLI + "=" + Id, null);
		return qt > 0;
	}

// TABELA SERVIÇOS: KEY_ID_SER, KEY_IDTIPO_SER, KEY_DESCRICAO_SER, KEY_VALOR

// GRAVAR SERVIÇO
	public long gravarServico(String descricao, String valor, String idservico, String idtipocarro){
		ContentValues valores = new ContentValues();
		valores.put(KEY_ID_SER, Integer.valueOf(idservico.trim()));
		valores.put(KEY_IDTIPO_SER, Integer.valueOf(idtipocarro.trim()));
		valores.put(KEY_DESCRICAO_SER, descricao);
		valores.put(KEY_VALOR, valor);
		return mDb.insert(DATABASE_TABLE_SERVICOS, null, valores);
	}

//  ALTERAR SERVIÇO
	public boolean atualizarServico(long Id, String descricao, String valor, String idservico, String idtipocarro){
		ContentValues valores = new ContentValues();
		valores.put(KEY_ID_SER, Integer.valueOf(idservico.trim()));
		valores.put(KEY_IDTIPO_SER, Integer.valueOf(idtipocarro.trim()));
		valores.put(KEY_DESCRICAO_SER, descricao);
		valores.put(KEY_VALOR, valor);
		return mDb.update(DATABASE_TABLE_SERVICOS, valores, KEY_ID_SER + "=" + Id, null) > 0;
	}

//  APAGAR SERVICO
	public boolean apagarServico(long Id){
		int qt = mDb.delete(DATABASE_TABLE_SERVICOS, KEY_ID_SER + "=" + Id, null);
		return qt > 0;
	}

// TABELA HORÁRIOS: KEY_ID_HOR E KEY_HORARIO

//  GRAVAR HORARIO
	public long gravarHorario(String hora){
		ContentValues valores = new ContentValues();
		valores.put(KEY_HORARIO, hora);
		return mDb.insert(DATABASE_TABLE_HORARIOS, null, valores);
	}

//  ALTERAR HORARIO
	public boolean atualizarHorario(long Id, String hora){
		ContentValues valores = new ContentValues();
		valores.put(KEY_HORARIO, hora);
		return mDb.update(DATABASE_TABLE_HORARIOS, valores, KEY_ID_HOR + "=" + Id, null) > 0;
	}

//  APAGAR HORARIO
	public boolean apagarHorario(long Id){
		int qt = mDb.delete(DATABASE_TABLE_HORARIOS, KEY_ID_HOR + "=" + Id, null);
		return qt > 0;
	}
	
// TABELA OS: KEY_ID_OS, KEY_IDCLIENTE_OS, KEY_IDSERVICO_OS, KEY_IDHORARIO_OS, KEY_DATA	
	
//  GRAVAR OS	
	public long gravarOs(String data, String idcarro_os, String idcliente_os, String idservico_os, String idhorario_os){
		ContentValues valores = new ContentValues();
		valores.put(KEY_ID_OS, Integer.valueOf(idcarro_os.trim()));
		valores.put(KEY_IDCLIENTE_OS, Integer.valueOf(idcliente_os.trim()));
		valores.put(KEY_IDSERVICO_OS, idservico_os);
		valores.put(KEY_IDHORARIO_OS, idhorario_os);
		valores.put(KEY_DATA, data);
		return mDb.insert(DATABASE_TABLE_OS, null, valores);
	}

//  ALTERAR OS
	public boolean atualizarOs(long Id, String data, String idcarro_os, String idcliente_os, String idservico_os, String idhorario_os){
		ContentValues valores = new ContentValues();
		valores.put(KEY_ID_OS, Integer.valueOf(idcarro_os.trim()));
		valores.put(KEY_IDCLIENTE_OS, Integer.valueOf(idcliente_os.trim()));
		valores.put(KEY_IDSERVICO_OS, idservico_os);
		valores.put(KEY_IDHORARIO_OS, idhorario_os);
		valores.put(KEY_DATA, data);
		return mDb.update(DATABASE_TABLE_OS, valores, KEY_ID_OS + "=" + Id, null) > 0;
	}

//  APAGAR OS
	public boolean apagarOs(long Id){
		int qt = mDb.delete(DATABASE_TABLE_OS, KEY_ID_OS + "=" + Id, null);
		return qt > 0;
	}
	
// CONSULTAS	
	
//  TODOS OS CLIENTES	
	public Cursor getTodosClientes(){
		return mDb.query(DATABASE_TABLE_CLIENTES, null, null, null, null, null, null);
	}
	
//  HORARIO POR ID	
	public Cursor getHorario(long Id){
		return mDb.query(DATABASE_TABLE_HORARIOS, null, KEY_ID_HOR + "=" + Id, null, null, null, null);
	}
	
	
// CLIENTE POR ID	
	public Cursor getCliente(long Id){
		return mDb.query(DATABASE_TABLE_CLIENTES, null, KEY_ID_CLI + "=" + Id, null, null, null, null);
	}
	
// CLIENTE POR NOME	
	public Cursor getClientePorNome(String nomeString){
		String[] selectionArgs = {nomeString + "%"};  
//		return mDb.query(DATABASE_TABLE_CLIENTES, null, KEY_NOME + "=" + selectionArgs, null, null, null, null);
		return mDb.rawQuery("SELECT * FROM clientes WHERE nome like ?", selectionArgs);
	}


//  CARRO POR PLACA
	public Cursor getCarro(String modeloString){
//		return mDb.query(DATABASE_TABLE_CARROS, null, KEY_NOME + "=" + nomeString, null, null, null, null);
		String[] selectionArgs = {modeloString + "%"};  
		return mDb.rawQuery("SELECT * FROM carros WHERE placa like ?", selectionArgs);
	}

	
//  CARRO X CLIENTE POR PLACA
	public Cursor getCarroPorPlaca(String placaString){
		String[] selectionArgs = {placaString};  
//		return mDb.rawQuery("SELECT ca.placa, ca.modelo, c.nome FROM clientes c INNER JOIN carros ca ON c._id = ca.id_cliente",null);
		return mDb.rawQuery("SELECT ca.placa, ca.modelo, c._id, c.nome FROM clientes c INNER JOIN carros ca ON c._id = ca.id_cliente WHERE ca.placa = ?", selectionArgs);
	}

//  CARRO X CLIENTE POR NOME CLIENTE
	public Cursor getCarroPorCliente(String nomeString){
		String[] selectionArgs = {nomeString + "%"};  
		return mDb.rawQuery("SELECT ca.placa, ca.modelo, c._id, c.nome FROM clientes c INNER JOIN carros ca ON c._id = ca.id_cliente WHERE c.nome like ?", selectionArgs);
	}

// CARRO X CLIENTE TODOS
	public Cursor getCarrosCliente(){
		return mDb.rawQuery("SELECT ca.placa, ca.modelo, c._id, c.nome FROM clientes c INNER JOIN carros ca ON c._id = ca.id_cliente", null);
	}
	
	
	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) {
		}
		
	}
}

Cadastrar Horários

package br.me.aqua;

import br.me.aqua.banco.DbAdapter;
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 CadastrarHorario extends Activity { // Início da Classe CadastrarCliente
	private long mId;
	private EditText Horario;
	private ImageButton salvar, pesquisar, limpar, voltar;
	
	private DbAdapter mDb;
	
	@Override
	protected void onCreate(Bundle icicle){ // Início do método onCreate
		super.onCreate(icicle);
		setContentView(R.layout.cad_horarios);
		
		mDb = new DbAdapter(this);
		mId = getIntent().getLongExtra(DbAdapter.KEY_ID_HOR, 0);
		
		Horario = (EditText) findViewById(R.id.edtHorario);
		
		if(mId > 0){
			mDb.open();
			Cursor horario = mDb.getHorario(mId);
			if(horario.moveToFirst()){
				Horario.setText(horario.getString(horario.getColumnIndex(DbAdapter.KEY_HORARIO)));
			}
			mDb.close();
		}
		
		// Código do botão Salvar da Tela de Cadastro de Clientes
		salvar = (ImageButton) findViewById(R.id.btSalvar);

		salvar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				String horarioString = Horario.getText().toString();
				
				mDb.open();
				if(mId == 0){ // Inclusão
					if(Horario.getText().toString().equals("")){
						mensagemExibir("Erro ao Salvar","Dados em branco, verifique!");
						return;
					}
				
					long id = mDb.gravarHorario(horarioString);
					if(id != -1)
						setResult(RESULT_OK);
						mensagemExibir("Salvar","Horário cadastrado com sucesso!");
				}else{ // Alteração
					boolean alterado = mDb.atualizarHorario(mId, horarioString);
					if(alterado)
						setResult(RESULT_OK);
						mensagemExibir("Atualização","Horário" + "Horário alterado com sucesso!");
				}
				mDb.close();
				finish();
			}
		});

		// Código do botão Cancelar da Tela de Cadastro de Clientes
		pesquisar = (ImageButton) findViewById(R.id.btPesquisar);
		pesquisar.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				mDb.open();
				if(Horario.getText().toString().equals("")){
					mensagemExibir("Erro ao Pesquisar","Dados em branco, verifique!");
					return;
				}
				
				String horarioString = Horario.getText().toString();
				Cursor horario = mDb.getClientePorNome(horarioString);
				while(horario.moveToNext()){
					Horario.setText(horario.getString(horario.getColumnIndex("hor_horario")));
				}
				mDb.close();
			}
		});
		
		limpar = (ImageButton) findViewById(R.id.btLimpar);
		
		limpar.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
			  Horario.setText("");
			}
		});

		
		// Código do botão Cancelar da Tela de Cadastro de Clientes
		voltar = (ImageButton) findViewById(R.id.btVoltar);

		// Início do setOnClickListener. Volta para a Tela Principal
		voltar.setOnClickListener(new OnClickListener() {
			public void onClick(View view) {
				setResult(RESULT_CANCELED);
				// Fecha a tela
				finish();
			}
		}); // Fim do setOnClickListener
		
	} // Fim do método onCreate

	 public void mensagemExibir(String titulo, String texto){
	    	AlertDialog.Builder mensagem = new AlertDialog.Builder(CadastrarHorario.this);
	    	mensagem.setTitle(titulo);
	    	mensagem.setMessage(texto);
	    	mensagem.setNeutralButton("Ok", null);
	    	mensagem.show();
	 }
	
} // Fim da Classe CadastrarHorarios

Erro ao clicar no botão salvar:

06-04 00:44:56.851: E/AndroidRuntime(465): android.database.sqlite.SQLiteException: near “,”: syntax error: create table carros (_id integer primary key autoincrement, id_cliente integer, id_tipo_carro integer, car_modelo text, car_placa text, FOREIGN KEY ( id_cliente ) REFERENCES clientes (_id ) ON DELETE RESTRICT ON UPDATE CASCADE), FOREIGN KEY ( id_tipo_carro ) REFERENCES tipo_carro (id_tipo_carro ) ON DELETE RESTRICT ON UPDATE CASCADE);

62 Respostas

R

ve se não é aqui:

ON DELETE RESTRICT ON UPDATE CASCADE),

altera pra :

ON DELETE RESTRICT ON UPDATE CASCADE ,
F

Em que parte vc identificou?

R
//  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);";

altera para:

//  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);";
F

Estou trocando. Vou testar. Você viu algo a mais de errado?

Troquei e deu outro erro:

06-04 01:33:52.620: E/AndroidRuntime(525): android.database.sqlite.SQLiteException: near “,”: syntax error: create table os (_id integer primary key autoincrement, id_cliente integer, car_modelo text, car_placa text, FOREIGN KEY ( id_cliente ) REFERENCES clientes (_id ) ON DELETE RESTRICT ON UPDATE CASCADE), FOREIGN KEY ( id_servico ) REFERENCES servicos (id_servico ) ON DELETE RESTRICT ON UPDATE CASCADE), FOREIGN KEY ( id_horario ) REFERENCES horarios (id_horario ) ON DELETE RESTRICT ON UPDATE CASCADE);

F

Ramon Pires, postei outro erro.

R

1º tenta entender o sql gerado.
Se você olhar direito o erro é o mesmo ,talvez ele se repita no sql das suas outras tabelas:

ON DELETE RESTRICT ON UPDATE CASCADE),

Altera para :

ON DELETE RESTRICT ON UPDATE CASCADE,
F

Nessa aqui, certo?

//  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_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);";

Seria isso?

F

Agora deu esse erro:

06-04 02:16:52.460: E/AndroidRuntime(557): android.database.sqlite.SQLiteException: unknown column “id_servico” in foreign key definition: create table os (_id integer primary key autoincrement, id_cliente integer, car_modelo text, car_placa text, FOREIGN KEY ( id_cliente ) REFERENCES clientes (_id ) ON DELETE RESTRICT ON UPDATE CASCADE, FOREIGN KEY ( id_servico ) REFERENCES servicos (id_servico ) ON DELETE RESTRICT ON UPDATE CASCADE, FOREIGN KEY ( id_horario ) REFERENCES horarios (id_horario ) ON DELETE RESTRICT ON UPDATE CASCADE);

R

exatamente

F

06-04 02:16:52.460: E/AndroidRuntime(557): android.database.sqlite.SQLiteException: unknown column “id_servico” in foreign key definition: create table os (_id integer primary key autoincrement, id_cliente integer, car_modelo text, car_placa text, FOREIGN KEY ( id_cliente ) REFERENCES clientes (_id ) ON DELETE RESTRICT ON UPDATE CASCADE, FOREIGN KEY ( id_servico ) REFERENCES servicos (id_servico ) ON DELETE RESTRICT ON UPDATE CASCADE, FOREIGN KEY ( id_horario ) REFERENCES horarios (id_horario ) ON DELETE RESTRICT ON UPDATE CASCADE);

Agora deu esse, estou analisando aqui mas não estou identificando o erro. Sei que é o campo id_servico.

R

Novamente,olhe no sql gerado e veja que não está declarado o id_servico na tabela.

F

Então, aqui que declaro os campos:

//  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";

E o campo id_servico está declardo como KEY_IDSERVICO_OS

R

Tenta agora.

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_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);";
F

Agora deu esse:

06-04 02:30:35.871: E/AndroidRuntime(587): android.database.sqlite.SQLiteException: unknown column “id_horario” in foreign key definition: create table os (_id integer primary key autoincrement, id_cliente integer, id_servico integer, car_modelo text, car_placa text, FOREIGN KEY ( id_cliente ) REFERENCES clientes (_id ) ON DELETE RESTRICT ON UPDATE CASCADE, FOREIGN KEY ( id_servico ) REFERENCES servicos (id_servico ) ON DELETE RESTRICT ON UPDATE CASCADE, FOREIGN KEY ( id_horario ) REFERENCES horarios (id_horario ) ON DELETE RESTRICT ON UPDATE CASCADE);

O que está acontecendo?

O que vc fez para arrumar no outro erro?

R
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);";
F

Funcionou, mas não estou identifiquei onde estava o erro. Poderia me explicar?

Está gravando mas voltando para a tela principal. Gostaria que mostrasse a mensagem que gravou e ficasse na mesma tela.

R

vc havia criado a referência para chave estrangeira, mas não criou o campo no sql da tabela que referênciaria o id da outra tabela.

E referente a sua outra dúvida:

salvar.setOnClickListener(new OnClickListener() {  
              
            @Override  
            public void onClick(View v) {  
                String horarioString = Horario.getText().toString();  
                  
                mDb.open();  
                if(mId == 0){ // Inclusão  
                    if(Horario.getText().toString().equals("")){  
                        mensagemExibir("Erro ao Salvar","Dados em branco, verifique!");  
                        return;  
                    }  
                  
                    long id = mDb.gravarHorario(horarioString);  
                    if(id != -1)  
                        setResult(RESULT_OK);  
                        mensagemExibir("Salvar","Horário cadastrado com sucesso!");  
                }else{ // Alteração  
                    boolean alterado = mDb.atualizarHorario(mId, horarioString);  
                    if(alterado)  
                        setResult(RESULT_OK);  
                        mensagemExibir("Atualização","Horário" + "Horário alterado com sucesso!");  
                }  
                mDb.close();  
                finish();  
            }  
        });

Você está chamando esse “finish()” , ele finaliza a sua activity atual e chama a última activity executada no seu stack de activities, que no caso deve ser sua Tela Principal.
Remove o finish() ,que sua activity não será finalizada.

F

Ok, resolvido. Será que não ocorrerá mais esse erro com as demais sql?

R

Acredito que não. Pergunta: Essa aplicação é pessoal ou para algum cliente?

F

Estudo, porque? Estou com uma dúvida: Como poderia mostrar os horários cadastrados?

R

Recomendo que vc abstraia esse acesso ao seu banco utilizando algum DAO , ai fica mais fácil de dar manutenção no seu código.

F

Como faria isso? E como mostraria os horários cadastrados na própria tela de cadastro? Horários por exemplo, que é o que estou fazendo no momento. Poderia me ajudar a montar esse DAO?

Teria algum exemplo para me mandar com DAO para que possa adaptar?

[email removido]

F

Como mudar esse meu para DAO? Poderia me ajudar?

R

Segue por aqui: http://www.vogella.com/articles/AndroidSQLite/article.html

F

Não teria como mandar um exemplo ou tentar adaptar esse meu para DAO? Como fazer nesse caso que tem várias tabelas?

R

Cara, lê o que eu te passei que você consegue. No caso de várias tabelas você vai criar um DAO para cada tabela que você tem no banco, e ai vc define os métodos dentro do DAO para criar, ler,alterar e excluir. É só adaptar o CommentsDataSource do exemplo para sua situação.

F

To dando uma lida no artigo, mas to meio perdido, nunca usei DAO, entendeu? Queria uma ajuda de como começar isso ai. To lendo mas não to entendendo direito.

Do jeito que fiz está errado? To vendo no artigo que alguma coisa parece com que fiz.

R

Segue o exemplo que vai dar certo, dá pra perceber que vc não deve vir do mundo java, não conhecer o pattern DAO chega a ser estranho.

F

Eu conheço o DAO, só nunca usei, entendeu? Percebo que no artigo tem parte que fiz igual.

R

Antes de fazer no seu projeto tenta então refazer o projeto do exemplo,ai você adapta depois para o seu projeto, é simples demais.

F

Teria que fazer um DAO para Clientes, um DAO para Carros, um DAO para Tipo_Carro, um DAO para Servicos, um DAO para Horarios e outro DAO para OS?

R

Isso.

F

Então, me ajuda a montar um DAO para Clientes, o resto eu faço igual.

R

Depois eu vejo isso pra vc.

F

é complicado isso?

R

Não.

F

Vamos fazer juntos para tabela Clientes pra eu aprender, ai sigo o que fiz e faço as demais.

R
public class ClienteDao {
	private DbAdapter dbAdapter;
	private SQLiteDatabase mDb;
	public ClienteDao(Context context){
		this.dbAdapter = new DbAdapter(context);
	}
	
	 public long gravarCliente(String nome, String endereco, String telefone, String celular, String email){
		 	dbAdapter.open();
	        ContentValues valores = new ContentValues();  
	        valores.put(KEY_NOME, nome);  
	        valores.put(KEY_ENDERECO, endereco);  
	        valores.put(KEY_TELEFONE, telefone);  
	        valores.put(KEY_CELULAR, celular);  
	        valores.put(KEY_EMAIL, email);
	        Long id = mDb.insert(DATABASE_TABLE_CLIENTES, null, valores);
	        dbAdapter.close();
	        return id;  
	    }  
	  
	//  ALTERAR CLIENTE  
	    public boolean atualizarCliente(long Id, String nome, String endereco, String telefone, String celular, String email){
	    	dbAdapter.open();
	        ContentValues valores = new ContentValues();  
	        valores.put(KEY_NOME, nome);  
	        valores.put(KEY_ENDERECO, endereco);  
	        valores.put(KEY_TELEFONE, telefone);  
	        valores.put(KEY_CELULAR, celular);  
	        valores.put(KEY_EMAIL, email);  
	        boolean success = mDb.update(DATABASE_TABLE_CLIENTES, valores, KEY_ID_CLI + "=" + Id, null) > 0;
	        dbAdapter.close();
	        return  success;
	    }  
	  
	//  APAGAR CLIENTE  
	    public boolean apagarCliente(long Id){
	    	dbAdapter.open();
	        int qt = mDb.delete(DATABASE_TABLE_CLIENTES, KEY_ID_CLI + "=" + Id, null);
	        dbAdapter.close();
	        return qt > 0;  
	    }
	    
	//  TODOS OS CLIENTES     
	    public Cursor getTodosClientes(){  
	        return mDb.query(DATABASE_TABLE_CLIENTES, null, null, null, null, null, null);  
	    }  
	      
	      
	      
	// CLIENTE POR ID     
	    public Cursor getCliente(long Id){  
	        return mDb.query(DATABASE_TABLE_CLIENTES, null, KEY_ID_CLI + "=" + Id, null, null, null, null);  
	    }  
	      
	// CLIENTE POR NOME   
	    public Cursor getClientePorNome(String nomeString){  
	        String[] selectionArgs = {nomeString + "%"};    
//	      return mDb.query(DATABASE_TABLE_CLIENTES, null, KEY_NOME + "=" + selectionArgs, null, null, null, null);  
	        return mDb.rawQuery("SELECT * FROM clientes WHERE nome like ?", selectionArgs);  
	    }  
}

Vai dar erro,mas é só você acertar o que tá faltando.
E segue o exemplo para você ter referência.

F

Esse é o famoso DAO então? Agora para fazer para as demais tabelas seria somente mudar o nome da classe para a outra tabela. Com isso eu separo as tabelas, correto? Faria todos os métodos para cada uma delas. No meu exemplo, uso DbAdapter, mudo para DAO e a chamada seria a mesma mudando somente o nome da classe?

Não usaria mais a DbAdapter que tem no projeto?

R

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.

F

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.”

F

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.”

F

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?

R

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

F

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?

R

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ê.

F

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é?

R

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.

F

No Adapter eu coloco somente a parte de criação das tabelas, certo?

R

isso

F

E como que chamaria as duas classes DAO e Adapter quando precisar delas?

F

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?

R

isso.

F

Ramon, obrigado, vc está me ajudando muito. Só uma pergunta, teria outro jeito mais prático de gerar as tabelas?

R

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.

F

Vixe, do jeito que tá vc recomenda o uso?

R

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.

F

Como assim, não entendi. Tem skype ou face?

[email removido]

F

Ramon, poderia me ajudar a montar as classes DAO?

R

Olha o exemplo, http://www.vogella.com/articles/AndroidSQLite/article.html , alterei pra CommentsDAO:

public class CommentsDao {

  // Database fields
  private SQLiteDatabase database;
  private MySQLiteHelper dbHelper;
  private String[] allColumns = { MySQLiteHelper.COLUMN_ID,
      MySQLiteHelper.COLUMN_COMMENT };

  public CommentsDao(Context context) {
    dbHelper = new MySQLiteHelper(context);
  }

  public void open() throws SQLException {
    database = dbHelper.getWritableDatabase();
  }

  public void close() {
    dbHelper.close();
  }

  public Comment createComment(String comment) {
    ContentValues values = new ContentValues();
    values.put(MySQLiteHelper.COLUMN_COMMENT, comment);
    long insertId = database.insert(MySQLiteHelper.TABLE_COMMENTS, null,
        values);
    Cursor cursor = database.query(MySQLiteHelper.TABLE_COMMENTS,
        allColumns, MySQLiteHelper.COLUMN_ID + " = " + insertId, null,
        null, null, null);
    cursor.moveToFirst();
    Comment newComment = cursorToComment(cursor);
    cursor.close();
    return newComment;
  }

  public void deleteComment(Comment comment) {
    long id = comment.getId();
    System.out.println("Comment deleted with id: " + id);
    database.delete(MySQLiteHelper.TABLE_COMMENTS, MySQLiteHelper.COLUMN_ID
        + " = " + id, null);
  }

  public List<Comment> getAllComments() {
    List<Comment> comments = new ArrayList<Comment>();

    Cursor cursor = database.query(MySQLiteHelper.TABLE_COMMENTS,
        allColumns, null, null, null, null, null);

    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
      Comment comment = cursorToComment(cursor);
      comments.add(comment);
      cursor.moveToNext();
    }
    // Make sure to close the cursor
    cursor.close();
    return comments;
  }

  private Comment cursorToComment(Cursor cursor) {
    Comment comment = new Comment();
    comment.setId(cursor.getLong(0));
    comment.setComment(cursor.getString(1));
    return comment;
  }
}

Você vai ter que fazer exatamente isso no seu dao,adequando a sua necessidade.
OBS: Se vc não for um cara criado a leite com pera, e ler o artigo,vc consegue resolver isso tranquilamente.

F

Concluindo então:

Meu adapter ficaria assim: pacote x

[color=red]DbAdapter[/color]

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) {  
        }  
          
    }  
      
}

Como ficaria o [color=red]DAO para TipoVeiculo[/color]: pacote Y

// TABELA TIPO CARRO : KEY_ID_TIP, KEY_TIPDESC
	
//  GRAVAR TIPO CARRO
	public long gravarTipoVeiculo(String tipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_TIPDESC, tipo);
		return mDb.insert(DATABASE_TABLE_TIPO_CARRO, null, valores);
	}

//  ALTERAR TIPO CARRO
	public boolean atualizarTipoCarro(long Id, String tipo){
		ContentValues valores = new ContentValues();
		valores.put(KEY_TIPDESC, tipo);
		return mDb.update(DATABASE_TABLE_TIPO_CARRO, valores, KEY_ID_TIP + "=" + Id, null) > 0;
	}

//  APAGAR TIPO CARRO
	public boolean apagarTipoCarro(long Id){
		int qt = mDb.delete(DATABASE_TABLE_TIPO_CARRO, KEY_ID_TIP + "=" + Id, null);
		return qt > 0;
	}

//  TIPO VEÍCULO POR ID	
	public Cursor getTipo(long Id){
		return mDb.query(DATABASE_TABLE_TIPO_CARRO, 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_carro WHERE tip_descricao like ?", selectionArgs);
	}

E como ficaria a chamada para DAO e DbAdapter?

F

Como faria o DAO com o código Tipo Veiculo postado? E como faria a chamada do Adapter e DAO em outra Activity?

public class TipoVeiculoDAO {

}
Criado 3 de junho de 2013
Ultima resposta 7 de jun. de 2013
Respostas 62
Participantes 2