Acessando sqlite em outras classes

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);

[code]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();
	}
}

[/code]

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 ?
:confused:
Sou muito grato desde já …
abraços …

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+

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

[code]
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);
}

}[/code]

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 …

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 …

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.

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 !
=)

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.

É 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 …
=)

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 :]

Valerio,

Poderia me ajudar qto a relacionamentos no SQLite?