Bom dia pessoal,
Estou com um problema. Tenho essa string para criar duas tabelas na minha classe DbAdapter, ok? Ao tentar gravar, informou que gravou com sucesso mas no logCat deu o seguinte erro:
08-21 13:28:24.106: E/Database(280): android.database.sqlite.SQLiteException: no such table: carros: , while compiling: INSERT INTO carros(placa, modelo, id_cliente) VALUES(?, ?, ?);
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";
private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE_CLIENTES + " ("
+ KEY_IDCLI + " integer primary key autoincrement, "
+ KEY_NOME + " text, "
+ KEY_ENDERECO + " text); 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);";
// Grava carro
public long gravarCarroCliente(String idcliente, String modelo, String placa){
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);
}
Aqui é o código do botão para gravar:
mDb.gravarCarroCliente(idclienteString, modeloString, placaString);
...
+ KEY_IDCLIENTE + ", integer"
+ KEY_MODELO + " text, "
...
Se você for checar a string SQL, vai ver que tem algo como “, integermodelo” (olhe o espaço e vírgula no lugar errado).
Conselho: antes de fazer essa concatenação monstro, crie uma string SQL em um editor de texto qualquer, teste-a, e depois veja se você pode montá-la no seu programa e dar o mesmo resultado. Problemas com espaços e vírgulas são muito comuns quando se faz esse tipo de concatenação.
Fiz a correção:
// CRIA AS TABELAS
private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE_CLIENTES + " ("
+ KEY_IDCLI + " integer primary key autoincrement, "
+ KEY_NOME + " text, "
+ KEY_ENDERECO + " text); 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);";
Continua o erro:
08-21 13:28:24.106: E/Database(280): android.database.sqlite.SQLiteException: no such table: carros: , while compiling: INSERT INTO carros(placa, modelo, id_cliente) VALUES(?, ?, ?);
Pegue essa definição da sua string, e crie um programinha bem bobo (em Java SE mesmo, não precisa ser em Android) que imprima essa string. Confira para ver se está certa.
Eu já vi que tem um probleminha, mas é melhor para você entender como é que se consertam as coisas, e de qualquer jeito não sei se tem mais algum problema.
class Teste {
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";
private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE_CLIENTES + " ("
+ KEY_IDCLI + " integer primary key autoincrement, "
+ KEY_NOME + " text, "
+ KEY_ENDERECO + " text); 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);";
public static void main (String[] args) {
System.out.println (DATABASE_CREATE);
}
}
Veja qual é a saída desse programa. Só de olhar você vai ver que tem coisa errada. Se não conseguir enxergar isso, pegue algum programa que crie tabelas SQLite no Windows mesmo, para ver se a sintaxe está correta.
Mudei agora, 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);";
db.execSQL(DATABASE_CREATE_CLIENTES);
db.execSQL(DATABASE_CREATE_CARROS);
Ta dando esse erro:
08-21 14:49:37.036: E/Database(458): Failure 1 (near “,”: syntax error) on 0x267aa8 when preparing ‘create table carros (_id integer primary key autoincrement, id_cliente integer, modelo text, placatext), FOREIGN KEY (id_cliente) REFERENCES clientes (_id) ON DELETE RESTRICT ON UPDATE CASCADE);’.
Eu gravo o veículo e quando consulto não vem nada… O que estou fazendo de errado?
// 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_MODELO + " text, "
+ KEY_PLACA + ", text, "
+ KEY_IDCLIENTE + " integer);";
// Grava carro
public long gravarCarroCliente(String modelo, String placa){
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);
}
//eu que fiz essa
public Cursor getCarroPorPlaca(String nomeString){
String[] selectionArgs = {nomeString + "%"};
return mDb.rawQuery("SELECT * FROM clientes WHERE nome like ?", selectionArgs);
// return mDb.rawQuery("SELECT placa, modelo, nome FROM clientes INNER JOIN carros ON clientes._id = carros.id_cliente WHERE placa like ?", selectionArgs);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(DATABASE_CREATE_CLIENTES);
db.execSQL(DATABASE_CREATE_CARROS);
}
Aqui eu gravo:
mDb.gravarCarroCliente(modeloString, placaString);
Olá pessoal, estou com o mesmo problema! Conseguiu resolver fbrigatt?
att,
Andreia
Qual o seu problema? Faz tanto tempo que já nem lembro mais desse post. Fiz um outro que ta funcionando. O que você precisa, andreia_android?