Seria essa linha:
SQLiteDatabase db = new DB(ctx).getWritableDatabase();
Colocar ela na Classe DB, certo?
Seria essa linha:
SQLiteDatabase db = new DB(ctx).getWritableDatabase();
Colocar ela na Classe DB, certo?
Até pode veio, mas sabe-se lá deus quando vou conseguir fazer.
[quote=fbrigatt]Seria essa linha:
SQLiteDatabase db = new DB(ctx).getWritableDatabase();
Colocar ela na Classe DB, certo?[/quote]
Não veio, o getWritableDatabase() tu coloca no onCreate() da tua classe DB.
no construtor do teu DAO
db = new DB(ctx);
Instancia o teu db
[code]
private SQLiteDatabase db;
[code]
Entendeu? fazendo isso, tu iria usar o db instanciado em qualquer dos teus métodos, sem a necessidade de criar um novo objeto para cada ação.
Vou postando aqui o que to fazendo então, ai vc vai vendo, é melhor?
Seria isso: Classe DB
package com.br.aquavendas.banco;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DB extends SQLiteOpenHelper{
private SQLiteDatabase db;
private static String dbName = "aqua.db";
private static String sql_cliente = "CREATE TABLE [clientes] ([id] integer primary key autoincrement, [razaosocial_nome] text, [nome_fantasia] text, [cnpj_cpf] text, [ie] text, [email] text, [contato] text, [endereco] text, [bairro] text, [cep] text, [cidade] text, [telefone] text, [celular] text, [data_cadastro] text);";
private static String sql_produto = "CREATE TABLE [produtos] ([id] integer primary key autoincrement, [linha] text, [produto] text, [embalagem] text, [valor_unitario] double(10,2), [valor_caixa] double(10,2), [tipo] text);";
private static String sql_venda = "CREATE TABLE [vendas] ([id] integer primary key autoincrement, [data_venda] text, [id_cliente] text, [id_produto] text, [qtde] text, [unitario] text, [desconto] text, [total] text, [vendedor] text);";
private static int version = 1;
public DB(Context ctx) {
super(ctx, dbName, null, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(sql_cliente);
db.execSQL(sql_produto);
db.execSQL(sql_venda);
SQLiteDatabase db = new DB(ctx).getWritableDatabase();
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
}
to tri atucanado aqui, te passei a classe DB errada
[quote=fbrigatt]kmunga, tenho a classe DB que é onde cria o banco. O que posso fazer nela pra acabar com esse erro?
[code]
package com.br.aquavendas.banco;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DB extends SQLiteOpenHelper{
private static String dbName = "aqua.db";
private static String sql_cliente = "CREATE TABLE [clientes] ([id] integer primary key autoincrement, [razaosocial_nome] text, [nome_fantasia] text, [cnpj_cpf] text, [ie] text, [email] text, [contato] text, [endereco] text, [bairro] text, [cep] text, [cidade] text, [telefone] text, [celular] text, [data_cadastro] text);";
private static String sql_produto = "CREATE TABLE [produtos] ([id] integer primary key autoincrement, [linha] text, [produto] text, [embalagem] text, [valor_unitario] double(10,2), [valor_caixa] double(10,2), [tipo] text);";
private static String sql_venda = "CREATE TABLE [vendas] ([id] integer primary key autoincrement, [data_venda] text, [id_cliente] text, [id_produto] text, [qtde] text, [unitario] text, [desconto] text, [total] text, [vendedor] text);";
private static int version = 1;
public DB(Context ctx) {
super(ctx, dbName, null, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(sql_cliente);
db.execSQL(sql_produto);
db.execSQL(sql_venda);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
}
public SQLiteDatabase getDatabase(){
return this.getWritableDatabase();
}
}
[/code][/quote]
ai no construtor da tua classe dao
DB banco =new DB(ctx);
db = banco.getDatabase();
Sobre fechar o banco, pense assim, tua aplicação precisa carregar uma lista de usuarios que estão em teu banco o que tu faz?
1 - Abre o banco (ou cria caso nao exista);
2 - Faz a operação, no caso, retorna uma lista com os usuarios cadastrados;
3 - Fecha o banco;
cada ação da tua aplicação deve obedecer essa logica.
Ta dando esse erro:
db.getWritableDatabase(); The method getWritableDatabase() is undefined for the type SQLiteDatabase
Classe DB
Não to entendendo onde tem que fechar o banco nas Classes DAO, me ajuda.
De uma olhada no ultimo post editado
Seria o que vc disse:
“to tri atucanado aqui, te passei a classe DB errada”, rs?
[quote=fbrigatt]Seria o que vc disse:
“to tri atucanado aqui, te passei a classe DB errada”, rs?[/quote]
Esse mesmo, mas acho que agora vai funcionar, se tu pensar naquela logica tu deve resolver a questão.
Eu to tri atucanado aqui no trampo, pra ti ter uma ideia, era pra ter dado um citar e acabei editando o topico.
De boa, vc tem skype ou gtalk?
eu não posso usar aqui no meu serviço, mas vamos teclando por aqui mesmo, mais pessoas podem ver e tentar ajudar.
Tudo bem, é pra contato mesmo, podemos ficar aqui, tudo bem.
kmunga,
Faltou te perguntar como seria para fechar o banco nas Classes.
db.close();
Seria isso? Em que parte do código colocaria essa linha se fosse isso?
Essa linha nas Classes DAO eu tiro?
SQLiteDatabase db = new DB(ctx).getWritableDatabase();
E coloco isso:
DB banco =new DB(ctx);
db = banco.getDatabase();
[quote=fbrigatt]kmunga,
Faltou te perguntar como seria para fechar o banco nas Classes.
db.close();
Seria isso? Em que parte do código colocaria essa linha se fosse isso?
[/quote]
Pense naquilo que te disse, por exemplo no trecho que tu deletou um determinado usuario
public void onClick(DialogInterface dialog, int which) {
ClienteDAO dao = new ClienteDAO(getBaseContext());
ClienteVO cliente = dao.getById(idItem);
if(dao.delete(cliente) == true){
Toast.makeText(getBaseContext(), "Excluído com sucesso!", Toast.LENGTH_LONG).show();
ltw.setAdapter(new ClienteAdapter(getBaseContext(), dao.getAll()));
dao.fecha_banco();
}
Entendeu, tu abriu o dao (e o banco), fez as operações que queria e então mandou o dao fechar o banco, pois não esta mais sendo usado.
[quote=fbrigatt]kmunga,
Essa linha nas Classes DAO eu tiro?
SQLiteDatabase db = new DB(ctx).getWritableDatabase();
E coloco isso:
DB banco =new DB(ctx);
db = banco.getDatabase();
[/quote]
Cara, tu cria o teu banco de dados no construtor do DAO, ai tu remove todas os SQLiteDatabase db = new DB(ctx).getWritableDatabase(); demais do teu codigo, pois não sao mais necessarios.
No dado tu vai manipular tuas informações apenas com o objeto criado, o db, não necessitando criar novos novamente.
Então na Classe DB coloco isso:
public SQLiteDatabase getDatabase(){
return this.getWritableDatabase();
}
E onde tem essa linha nas Classes DAO eu tiro:
SQLiteDatabase db = new DB(ctx).getWritableDatabase();
E coloco isso no Construtor:
DB banco =new DB(ctx);
db = banco.getDatabase();
Que seria aqui:
public ClienteDAO(Context ctx){
this.ctx = ctx;
}
Perfeito, é isso ai, caso consiga resolver teu problema, coloca RESOLVIDO no topico pra saber que já tá tudo ok
Vou fazer o que disse e posto o resultado.
kmunga, tira essa linha também:
public class ClienteDAO {
private SQLiteDatabase db; // Essa aqui
private static String table_name = "clientes";
private static Context ctx;
private static String[] columns = {"id", "razaosocial_nome", "nome_fantasia", "cnpj_cpf", "ie", "email", "contato", "endereco", "bairro", "cep", "cidade", "telefone", "celular", "data_cadastro"};