Fazer um select na aplicação android

11 respostas
J

Pessoal, já tenho aqui minha aplicaçãozinha segue o código:

package com.canalsac.galardaomobile.persistencedatabase;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;

public class TabelaDbHelper extends SQLiteOpenHelper
{
	//private static String DBPATH = "/data/data/com.canalsac.galardaomobile/databases/";
	private static String DBPATH = "/home/fabio/Área de trabalho/coletor-mobile/assets/";
	private static String DBNAME = "coletor.sqlite";
	
	private Context context;
	
	public TabelaDbHelper(Context context)
	{
		super(context, DBNAME, null, 2);
		this.context = context;
	}
	
	@Override
	public void onCreate(SQLiteDatabase db)
	{
		
	}
	
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
	{
		
	}
	
	private boolean checkDataBase()
	{
		SQLiteDatabase db = null;
		try
		{
			String path = DBPATH + DBNAME;
			db = SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READONLY);
			db.close();
		}
		catch(SQLiteException e)
		{
			
		}
		
		return db != null;
	}
	
	private void createDatabase() throws Exception
	{
		boolean exists = checkDataBase();
		
		if(!exists)
		{
			this.getReadableDatabase();
		}
		
		try
		{
			copyDatabase();
		}
		catch(IOException e)
		{
			throw new Error("Não foi possível copiar o arquivo");
		}
	}

private void copyDatabase() throws IOException
{
	String dbPath = DBPATH + DBNAME;
	OutputStream dbStream = new FileOutputStream(dbPath);
	InputStream dbInputStream = context.getAssets().open("coletor.sqlite");
	
	byte[] buffer = new byte[1024];
	int length;
	while ((length = dbInputStream.read(buffer))>0)
	{
		dbStream.write(buffer, 0, length);
	}
	
	dbInputStream.close();
	dbStream.flush();
	dbStream.close();
}
	public SQLiteDatabase getDatabase()
	{
		try
		{
			createDatabase();
			String path = DBPATH + DBNAME;
			return SQLiteDatabase.openDatabase(path, null, SQLiteDatabase.OPEN_READWRITE);
		}
		catch(Exception e)
		{
			return getWritableDatabase();
		}
	}

}

Preciso de uma ajudinha, como faço para fazer um select para testar se fiz certo a importação do meu banco de dados?

11 Respostas

D

Vc pode atribuir o resultado do select a um Cursor

public Cursor getAllUsuarios() {
		Cursor mCursor = mDb.query("usuarios", null, null, null,
				null, null, null);
		if (mCursor != null) {
			mCursor.moveToFirst();
		}
		return mCursor;
	}
J

Mas no caso eu primeiro não teria que dizer quais colunas existem na minha base?

D

Você conecta o banco e cria as tabelas depois no método que te passei você chama o Cursor e no método “mDb.query()” que se você olhar os atributos que passam por parâmetros tem como passar a tabela que no exemplo seria a tabela “usuarios” e caso você queira trazer somente algumas colunas você pode passar nos outros parâmetros que estão em “null” é possível fazer tbm where tudo nesse método.

Da uma olhada nesse site

http://www.tutoriandroid.com/2012/01/persistencia-de-dados-com-sqlite.html

J

Deixa eu passar p vê se entendi, eu não preciso necessariamente criar a minha tabela do meu banco de dados na aplicação? Posso somente criar aí como seu exemplo de usuários e passar as colunas por parâmetros?

D

Sim se você já possui seu banco e colocou por exemplo no cartão de memória, vc acessa sua base e faz select no banco e tudo certo, vai retornar todas as colunas da tabela

J

Olhe meus códigos:

package com.canalsac.galardaomobile.modelo;

public class Tabela 
{
	public static final String TABLE_NAME = "tabela";
	
	public static final String COLUMN_NAME_IDADE = "idade";
	public static final String COLUMN_NAME_CAPITAL = "capital";
	public static final String COLUMN_NAME_PRODUTO = "produto";
	public static final String COLUMN_NAME_MENSALIDADE = "mensalidade";
	
	private String idade;
	private String capital;
	private String produto;
	private String mensalidade;
	
	public String getIdade()
	{
		return idade;
	}
	public void setIdade(String idade)
	{
		this.idade=idade;
	}
	public String getCapital()
	{
		return capital;
	}
	public void setCapital(String capital)
	{
		this.capital = capital;
	}
	public String getProduto()
	{
		return produto;
	}
	public void setProduto(String produto)
	{
		this.produto = produto;
	}
	public String getMensalidade()
	{
		return mensalidade;
	}
	public void setMensalidade(String mensalidade)
	{
		this.mensalidade = mensalidade;
	}
	
}

e onde faz o select

package com.canalsac.galardaomobile.dao;

import org.json.JSONException;
import org.json.JSONObject;

import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.canalsac.galardaomobile.modelo.Tabela;
import com.canalsac.galardaomobile.persistencedatabase.TabelaDbHelper;
import android.content.Context;

public class TabelaDAO 
{
	private static final String SELECT_ALL = "select * from " +Tabela.TABLE_NAME;
	
	private SQLiteDatabase db;
	private TabelaDbHelper tabelaDbHelper;
	
	public TabelaDAO(Context context)
	{
		tabelaDbHelper = new TabelaDbHelper(context);
		db = tabelaDbHelper.getDatabase();
	}
	
	public JSONObject getPorIdade(String idade) 
	{
		JSONObject result = new JSONObject();
		
		Cursor cursor = db.rawQuery(SELECT_ALL + "where idade = 16", null);
		
		cursor.moveToFirst();
		while(!cursor.isAfterLast())
		{
			result = readRow(cursor);
			cursor.moveToNext();
		}
		
		cursor.close();
		return result;
	}

	private JSONObject readRow(Cursor cursor)
	{
		JSONObject obj = new JSONObject();
		
		try
		{
			obj.put(Tabela.COLUMN_NAME_MENSALIDADE, cursor.getString(0));
			obj.put(Tabela.COLUMN_NAME_PRODUTO, cursor.getString(1));
			obj.put(Tabela.COLUMN_NAME_CAPITAL, cursor.getString(2));
			obj.put(Tabela.COLUMN_NAME_IDADE, cursor.getString(3));
			
		}
		catch(JSONException e)
		{
			
		}
		return obj;
	}

}

Tem algo que possa acrescentar, fiz algo de errado?

D

Esse código está funcionando?

Pq na classe Tabela você tem atributos privados que não estão sendo usados e outros estáticos que vc chama na outra classe?

J

Estou tentando achar um jeito de printar isto na tela…

W

Se tu quer testar pq não conecta direto no banco do emulador com o adb shell?

adb shell
#sqlite3 /data/data/seu.pacote/databases/seu_banco
select * from sua_tabela;
.schema
J

wagnerfrancisco:
Se tu quer testar pq não conecta direto no banco do emulador com o adb shell?

adb shell #sqlite3 /data/data/seu.pacote/databases/seu_banco select * from sua_tabela; .schema

Abro o terminal e já dá comando não encontrado com o adb shell

W

O adb fica na pasta android/platform-tools, onde “android” eh a pasta que tu instalou sdk, emulador, etc.

Se não quiser sempre entrar no diretório, adicione-o no path do sistema.

Criado 7 de março de 2013
Ultima resposta 8 de mar. de 2013
Respostas 11
Participantes 3