Acessando sqlite em outras classes

10 respostas
F

Olá pessoal, procurei e não achei, porisso abri este tópico .. me desculpem caso eu tenha me enganado ..

Venho recorrer à vc´s, diante da seguinte questão:
Minha classe Main (principal), possui o script e gera o banco sqlite pra mim no oncreate. Assim como chama um método da classe dao (materiaDao).
Primeiro segue o código da classe Main: (que roda bonitinha, e gera o banco sem problemas);

public class Main extends Activity {

	public static final String NOME_BANCO = "agenda";
	SQLiteDatabase db;
	List<Materia> materias = new ArrayList<Materia>();
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		CriaBanco();
		MateriaDao materiaDao = new MateriaDao();
		materias = materiaDao.listarMaterias();
		if(materias.isEmpty()){
			msg("materias vazias");
		}else{		
			msg("possui materias");
		}
		
	}

public void CriaBanco(){
		try{
			db = openOrCreateDatabase(NOME_BANCO, MODE_PRIVATE, null);
			String SQL = "CREATE  TABLE IF NOT EXISTS `materia` (`idmateria` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT," +
					" `descricao` VARCHAR(45) NULL ,`professor` VARCHAR(45) NULL , `nota` FLOAT NULL , `faltas` INT NULL ," +
					" `status` VARCHAR(45) NULL);";
			 
			
			db.execSQL(SQL);
			msg("Banco criado com sucesso!");
			
		}catch(Exception erro){
			msg("Banco não pode ser criado."+erro);
		}finally{
			db.close();
		}
	}

E na classe MateriaDao, tenho o seguinte código, que me dá um nullPointer ao ter o método listarMaterias invocado (na verdade, me dá o nullPointer por naum consegue abrir o banco), e aí que está minha dificuldade:

public List<Materia> listarMaterias(){

		db = openOrCreateDatabase(Main.NOME_BANCO, MODE_PRIVATE, null);

Antes que alguém fale: acima deixei só os códigos que interessam .. ok ? (exemplo: ai em cima não tem return e etc .. pois isso não importa no caso) ..

Bom, será que alguém saberia me dizer o que possa estar errado ?
:/
Sou muito grato desde já ..
abraços ..

10 Respostas

kmunga

Cara, tu fez a maior confusão, tu deveria atribuir a classe DAO toda a responsabilidade de lidar com o banco de dados, desde cria-lo até inserir,deletar, alterar…

Cria uma classe DAO que extends SQLiteOpenHelper (ou algo assim, não me recordo direitinho a sintax), ai manda criar os metodos necessarios e pimba, jah vai te dar uma base.

Vai te poupar boas linhas de codigo e simplificar a coisa toda.

No construtor ele já cria o banco, e no onCreate irá criar a tabela conforme script. ai é só construir os metodos ali de inserir e outros necessarios.

Quando chegar em casa posto um exemplo, agora tenho q sair, t+

kmunga

Conforme o prometido

Seria melhor tu instanciar a tua classe DAO responsavel pelo banco de dados na classe principal

BancoDAO dao=new BancoDAO(this);
//ações que deseja fazer ex:
dao.insert(amigo);
dao.close();
E a classe DAO
package com.example.mapadeamigos.DAO;

import java.util.ArrayList;
import java.util.List;

import com.example.mapadeamigos.Amigos;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class AmigosDAO extends SQLiteOpenHelper {
	
	private static final String DATABASE="contatos";
	private static final String TABELA_NAME="amigos";
	private static final int VERSAO=1;
	private Context context;
	

	public AmigosDAO(Context context) {
		super(context, DATABASE, null, VERSAO);
		this.context=context;
	}

	public List&lt;Amigos&gt; getList() {
		List&lt;Amigos&gt; amigos=new ArrayList&lt;Amigos&gt;();
		String[] colunas={"id","nome","telefone","endereco","foto"};
		Cursor cursor=getWritableDatabase().query(TABELA_NAME,colunas,null,null,null,null,null);
		while (cursor.moveToNext()){
			Amigos amigo = new Amigos();
			amigo.setId(cursor.getLong(0));
			amigo.setNome(cursor.getString(1));
			amigo.setTelefone(cursor.getString(2));
			amigo.setEndereco(cursor.getString(3));
			amigo.setFoto(cursor.getString(4));
			amigos.add(amigo);
		}
		return  amigos;
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		String scriptDB=
				"CREATE TABLE " + TABELA_NAME + "(id INTEGER PRIMARY KEY AUTOINCREMENT,nome TEXT UNIQUE NOT NULL, telefone TEXT,"+
		         "endereco TEXT,foto TEXT";
		db.execSQL(scriptDB);		
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		String script="DROP TABLE IF EXITS" + TABELA_NAME;
		db.execSQL(script);
		this.onCreate(db);
		
	}

	public void adicionarAmigo(Amigos amigo) {
		ContentValues values = new ContentValues();
		values.put("nome", amigo.getNome());
		values.put("telefone",amigo.getTelefone());
		values.put("endereco",amigo.getEndereco());
		getWritableDatabase().insertOrThrow(TABELA_NAME,null, values);
	}
	
	public void removerAmigo(Amigos amigo){
		String[] args={amigo.getId().toString()};
		getWritableDatabase().delete(TABELA_NAME, "id=?", args);
	}
	

}
F

Mutíssimo obrigado kmunga !!
e essa costela aí ? hehe . barbaridade !! heheh

ou ! seu codigo me orientou / ajudou dimais !!
já consegui rodar…

porém só gostaria de explicar meu raciocínio, e esclarecer mais uma dúvida:
como meu banco tem bastante tabelas, e com inclusive algumas chaves estrangeiras (index), pensei em criar-lo na main, e deixar nas DAO as alterações desejadas … entende ?
e neste caso, onde rodo os comandos de index ? (já que cada classe DAO vai rodar seu script, e podealgum momento querer fazer referencia a uma tabela ainda não criada … entende ? porisso queria rodar o banco por completo na main …
:confused:
=)

abração, e obrigado novamente …

F

Olá !!

Considerando que tenho várias tabelas no meu banco, devo fazer 01 arquivo Dao para cada tabela ? ou apenas 01 arquivo para todo o banco ?

Grato por antecipação …

kmunga

Entendi tua colocação, mas de qualquer forma é aconselhável atribuir responsabilidades diferentes a classes diferentes.

Cara, eu acho que tu pode atribuir a responsabilidade a todas as tabelas a uma unica classe, a menos que tu ache que isso tornará o codigo muito grande e confuso de se entender, neste caso pode separa-lo.

Sobre tua duvida dos index, eu realmente não sei responder.

F

certo kmunga !!
obrigado novamente por seu interesse …

estou discutindo a situação em outro tópico que abriram (http://www.guj.com.br/java/301003-montar-dao#1598979) … e acho que chegamos à seguinte conclusão, quanto à melhor maneira para se organizar o código:

  • 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 …

=)

o que acha ?
=)
abração !
=)

kmunga

Perfeito, melhor ainda, é uma saída bem inteligente :smiley: Ai tu ve qual se encaixa melhor no teu codigo. O importante é que fique claro e de fácil manutenção.

F

É com muita satisfação que “encerro” este tópico !..
kmunga, seguinte, não preciso criar métodos abstratos nem nada, basta minhas classes dao herdarem minha classe que gera o banco …
simples assim … heheh …

portanto resumo:

  • criei uma classe extendendo sqliteOpenHelper;
  • tenho uma classe dao para cada entidade, sendo que cada uma delas extende à classe mencionada acima… e fim de papo …
    meu código está limpo e organizado …

=)
abraço . obrigado novamente e se alguém tiver dúvidas, estou à disposição …
=)

V

Frital, esta maneira de criar uma classe para criar toda estrutura do banco e 1 para cada tabela(Dao) é muito boa mesmo, eu mesmo tenho mais de 5 projetos que muitos clientes usam e pode ter certeza, funciona :]

F

Valerio,

Poderia me ajudar qto a relacionamentos no SQLite?

Criado 7 de junho de 2013
Ultima resposta 21 de jun. de 2013
Respostas 10
Participantes 4