Erro ao gravar

Amigos,

Crie duas tabelas, Clientes e Carros. Carros tem relacionamento com Clientes. O código de criação das tabelas é esse:


	private static final String DATABASE_TABLE_CLIENTES = "clientes";
	private static final String DATABASE_TABLE_CARROS = "carros";
	
//  CAMPOS DA TABELA CLIENTES	
	public static final String KEY_IDCLI = "_id";
	public static final String KEY_NOME = "nome";
	public static final String KEY_ENDERECO = "endereco";

//  CAMPOS DA TABELA CARROS	
	public static final String KEY_IDCARRO = "_id";
	public static final String KEY_IDCLIENTE = "id_cliente";
	public static final String KEY_MODELO = "modelo";
	public static final String KEY_PLACA = "placa";

Código abaixo cria a tabela Clientes:

//  CRIA A TABELA CLIENTES
	private static final String DATABASE_CREATE_CLIENTES = "create table " + DATABASE_TABLE_CLIENTES + " ("
	+ KEY_IDCLI + " integer primary key autoincrement, "
	+ KEY_NOME + " text, "
	+ KEY_ENDERECO + " text);";

Código abaixo cria a tabela Carros:

//  CRIA A TABELA CARROS
	private static final String DATABASE_CREATE_CARROS = "create table " + DATABASE_TABLE_CARROS + " ("
	+ KEY_IDCARRO + " integer primary key autoincrement, "
	+ KEY_MODELO + " text, "
	+ KEY_PLACA + ", text, "
	+ KEY_IDCLIENTE + " integer);";

Pergunta: O relacionamento entre Clientes e Carros está sendo feito?

Aqui eu método para gravar Cliente e Carro:

	// Grava cliente
	public long gravarCliente(String nome, String endereco){
		ContentValues valores = new ContentValues();
		valores.put(KEY_NOME, nome);
		valores.put(KEY_ENDERECO, endereco);
		
		return mDb.insert(DATABASE_TABLE_CLIENTES, null, valores);
	}
	
	// Grava carro
	public long gravarCarroCliente(String modelo, String placa, String idcliente){
		ContentValues valores = new ContentValues();
		valores.put(KEY_IDCLIENTE, idcliente);
		valores.put(KEY_MODELO, modelo);
		valores.put(KEY_PLACA, placa);
		
		return mDb.insert(DATABASE_TABLE_CARROS, null, valores);
	}

Abaixo método para busca Cliente e Carro:

	public Cursor getClientePorNome(String nomeString){
		String[] selectionArgs = {nomeString + "%"};  
		return mDb.rawQuery("SELECT * FROM clientes WHERE nome like ?", selectionArgs);
	}

	public Cursor getCarroPorPlaca(String placaString){
		String[] selectionArgs = {placaString + "%"};  
		return mDb.rawQuery("SELECT placa, modelo, nome FROM clientes INNER JOIN carros ON clientes._id = carros.id_cliente WHERE placa like ?", selectionArgs);
	}

O código abaixo executa as sql:

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.execSQL(DATABASE_CREATE_CLIENTES);
			db.execSQL(DATABASE_CREATE_CARROS);
		}

Aqui é o método do botão para gravar:

		salvar = (ImageButton) findViewById(R.id.btSalvar);

		salvar.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				String placaString = Placa.getText().toString();
				String modeloString = Modelo.getText().toString();
				String idclienteString = IdNome.getText().toString();
				mDb.open();
				if(Nome.getText().toString().equals("") || Placa.getText().toString().equals("")){
					mensagemExibir("Erro ao Salvar","Nome OU Placa em branco, verifique!");
					return;
				}
				
				mDb.gravarCarroCliente(modeloString, placaString, idclienteString);
				mensagemExibir("Salvar","Veículo cadastrado com sucesso!");
				mDb.close();
			}
		});

O que acontece é que quando gravo o carro e depois vou consultar, nada retorna. Onde estou errando? Não sei mais o que fazer…

Não retorna somente na consulta do carro ou do cliente também?
Já tentou imprimir o SQl que esta executando e executar o mesmo manualmente no BD? Caso não lhe retorne desta forma seu SQl esta errado.

Do cliente retorna. Como faço isso? Poderia ajudar, não sei mais o que fazer…

Você não poderá imprimir pois não está guardando o select em uma String.
Mas imprime System.out.println(variavel); a sua variável e depois copia o seu select

substitui o ? pela variável.

Qual o BD que você está usando?

Estou usando o SQLite do Android. Para cliente está gravando normal. O que está acontecendo? Como fazer no Eclipse isso? E o relacionamento entre CLIENTE x CARRO? Como fazer? Tem que usar FOREIGN KEY? jeffev, tem msn?

Isso, você deve usar chaves estrangeiras.
Talvez esse link posso lhe ajudar
http://www.sqlite.org/foreignkeys.html

Fiz assim:



//  CRIA A TABELA CLIENTES
	private static final String DATABASE_CREATE_CLIENTES = "create table " + DATABASE_TABLE_CLIENTES + " ("
	+ KEY_IDCLI + " integer primary key autoincrement, "
	+ KEY_NOME + " text, "
	+ KEY_ENDERECO + " text);";

	
//  CRIA A TABELA CARROS
	private static final String DATABASE_CREATE_CARROS = "create table " + DATABASE_TABLE_CARROS + " ("
	+ KEY_IDCARRO + " integer primary key autoincrement, "
	+ KEY_IDCLIENTE + " integer, "
	+ KEY_MODELO + " text, "
	+ KEY_PLACA + " text), FOREIGN KEY (id_cliente) " 
	+ "REFERENCES clientes (_id) ON DELETE RESTRICT ON UPDATE CASCADE);";

E ao gravar dá esse erro:

08-21 21:19:08.616: E/Database(1468): Failure 1 (near “,”: syntax error) on 0x263a80 when preparing ‘create table carros (_id integer primary key autoincrement, id_cliente integer, modelo text, placa text), FOREIGN KEY (id_cliente) REFERENCES clientes (_id) ON DELETE RESTRICT ON UPDATE CASCADE);’.

O erro está perto de uma virgula, acredito que seja nesta:

, FOREIGN KEY (id_cliente) " + "REFERENCES clientes (_id) ON DELETE RESTRICT ON UPDATE CASCADE);";

Então, não to conseguindo identificar o erro…