Jump to content
Psycop

Verificar se Registo Existe em BD SQLite e caso não exista Retornar Mensagem

Recommended Posts

Psycop

Boas noite,

Estou a tentar fazer uma pequena app que consiste pesquisar numa base de dados SQLite. Para a pesquisa irei usar duas formas, ou seja através do Numero ONU e através do Nome.

No entanto estou a deparar-me com um problema, a app estoura no caso de se tentar pesquisar sobre algum registo que não exista.

Como poderei fazer para que seja despoletada uma mensagem de erro no caso da pesquisa não encontrar um resultado?

DbHelper:

//Metodo ONU Query
    public List<Elemento> getONU()
    {
        List<Elemento> listaElementos = new ArrayList<Elemento>();

        //Seleccionar Query
        String selectQuery = "SELECT *FROM " + TABLE_NAME + " WHERE ONU = " + MainActivity.editText_ONU_search.getText();
        dbase = this.getReadableDatabase();

        Cursor cursor = dbase.rawQuery(selectQuery, null);

        //Loop por todas as linhas da BD e adiciona-las a lista
        if(cursor.moveToFirst())
        {
                Elemento element = new Elemento();
                element.setID(cursor.getInt(0));
                element.setONU(cursor.getInt(1));
                element.setNOME_SUB(cursor.getString(2));
                listaElementos.add(element);

        }

        //Return listaElementos;
        return listaElementos;

    }

    //Metodo Nome Query
    public List<Elemento> getNomeSubstancia()
    {
        List<Elemento> listaElementos = new ArrayList<Elemento>();

        //Seleccionar Query
        String selectQuery = "SELECT * FROM " + TABLE_NAME + " WHERE NOME_SUB = '" + MainActivity.editText_NOME_search.getText() + "'";
        dbase = this.getReadableDatabase();

        Cursor cursor = dbase.rawQuery(selectQuery, null);

        //Loop por todas as linhas da BD e adiciona-las a lista
        if(cursor.moveToFirst())
        {
                Elemento element = new Elemento();
                element.setID(cursor.getInt(0));
                element.setONU(cursor.getInt(1));
                element.setNOME_SUB(cursor.getString(2));
                listaElementos.add(element);

        }

        //Return listaElementos;
        return listaElementos;

    }

 

OnuResultActivity:

package com.example.nuno.materiasperigosasexample;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import com.example.nuno.materiasperigosasexample.Database.DbHelper;
import com.example.nuno.materiasperigosasexample.Database.Elemento;

import java.util.List;

public class OnuResultActivity extends AppCompatActivity {

    //Declaração de variaveis
    List<Elemento> listaElementos;
    int elemento_id = 0;

    Elemento currentElemento;
    TextView textView_onu, textView_nome_sub;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_onu_result);

        DbHelper db = new DbHelper(this);
        listaElementos = db.getONU();
        currentElemento = listaElementos.get(elemento_id);

        textView_onu = (TextView)findViewById(R.id.textView_onu);
        textView_nome_sub = (TextView) findViewById(R.id.textView_nome_sub);

        //Apresentar Info
        setElementosView();

    }

    private void setElementosView() {

        textView_onu.setText(Integer.toString(currentElemento.getONU()));
        textView_nome_sub.setText(String.valueOf(currentElemento.getNOME_SUB()));


        elemento_id++;
    }
}

 

NomeResultActivity:

package com.example.nuno.materiasperigosasexample;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;

import com.example.nuno.materiasperigosasexample.Database.DbHelper;
import com.example.nuno.materiasperigosasexample.Database.Elemento;

import java.util.List;

public class NomeResultActivity extends AppCompatActivity {

    //Declaração de variaveis
    List<Elemento> listaElementos;
    int elemento_id = 0;

    Elemento currentElemento;
    TextView textView_onu, textView_nome_sub;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_nome_result);

        DbHelper db = new DbHelper(this);
        listaElementos = db.getNomeSubstancia();
        currentElemento = listaElementos.get(elemento_id);

        textView_onu = (TextView)findViewById(R.id.textView_onu);
        textView_nome_sub = (TextView) findViewById(R.id.textView_nome_sub);

        //Apresentar Info
        setElementosView();
    }

    private void setElementosView() {

        textView_onu.setText(Integer.toString(currentElemento.getONU()));
        textView_nome_sub.setText(String.valueOf(currentElemento.getNOME_SUB()));

        elemento_id++;
    }
}

 

Alguma ideia de como poderei retornar uma mensagem de aviso quando a pesquisa não é encontrada de forma a cobrir a possibilidade de a pesquisa inserida pelo utilizador ser não corresponder ao que está na BD.

Cumprimentos

Psycop

Edited by Psycop

Share this post


Link to post
Share on other sites
Knitter

Tens um erro na primeira query, o * está colado ao FROM. Se o campo de pesquisa estiver vazio a sintaxe da query vai estar errada, a condição acaba com =" sem ter o segundo operador.

Apresentar uma mensagem ao utilizador é relativamente simples, embora no código que estás a usar, e como só estás a usar o método onCreate, vais ter outros problemas, mas se a lista de elementos estiver vazia, (verificas a quantidade de elementos depois de invocares os métodos de pesquisa) apresentas uma mensagem, com a classe Toast ou Snackbar.

Share this post


Link to post
Share on other sites
Psycop

Que outros problemas poderei vir a ter?

Qual seria a forma mais correcta de implementar uma pesquisa como a que pretendo'

Cumps

Share this post


Link to post
Share on other sites
Knitter

Estás a invocar o acesso à BD na thread principal, se o acesso demorar vais bloquear arranque da actividade e vais pendurar a thread principal, o que resulta no sistema Android terminar a tua actividade à força.

Também estás a aceder à BD no onCreate, que é invocado apenas quando a actividade é criada, se navegares para uma segunda actividade que insira/altere dados e depois voltares à primeira actividade, os dados desta não são actualizados com as novas alterações.

Estás a fazer um get na lista de resultados sem verificares se existe algum resultado, o que resulta em teres null nas tuas variáveis que depois também não estás a validar.

A forma "correcta" depende do objectivo final mas com o código que tens sugeria a utilização de AsyncTask para pesquisa na BD e a colocação de proteções no acesso às listas e conversões de dados.

 

  • Vote 1

Share this post


Link to post
Share on other sites
Psycop

O objectivo é mesmo apenas a consulta de dados! 

Basicamente pesquisas um elemento através do seu número ou nome e recebes os seus detalhes! É apenas isso!

Andei a procurar, mas não encontrei grandes exemplos a seguir para o que pretendo.

Poderias ajudar-me com algum exemplo ou semelhante?

Cumps

Share this post


Link to post
Share on other sites
HappyHippyHippo

numa revisão muito na diagonal do teu código, já que retornas sempre uma List, porque não testas o número de elementos dessa List ?

zero = Not Found


IRC : sim, é algo que ainda existe >> #p@p

Share this post


Link to post
Share on other sites
Knitter
public List<Elemento> getONU() {
    List<Elemento> listaElementos = new ArrayList<Elemento>();
    final String val = MainActivity.editText_ONU_search.getText();
    
    if(!val.isEmpty()) {;
        dbase = this.getReadableDatabase();
        Cursor cursor = dbase.rawQuery("SELECT * FROM " + TABLE_NAME + " WHERE ONU = " + val, null);

        if(cursor.moveToFirst()) {
            do {
                Elemento element = new Elemento();
                element.setID(cursor.getInt(0));
                element.setONU(cursor.getInt(1));
                element.setNOME_SUB(cursor.getString(2));
                listaElementos.add(element);
  		    } while(cursor.moveToNext());
        }
	}
  
    return listaElementos;
}

public List<Elemento> getNomeSubstancia() {
    // ... como anterior
}

//... na actividade

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_nome_result);

    textView_onu = (TextView)findViewById(R.id.textView_onu);
    textView_nome_sub = (TextView) findViewById(R.id.textView_nome_sub);
  
    DbHelper db = new DbHelper(this);
    listaElementos = db.getNomeSubstancia();
    if(listaElementos.size() > 0) {
        currentElemento = listaElementos.get(elemento_id);
        setElementosView();
    }
}

// ... isto podia estar dentro do onCreate 
private void setElementosView() {
    textView_onu.setText("" + currentElemento.getONU());
    textView_nome_sub.setText(currentElemento.getNOME_SUB());

    elemento_id++; // ?
}

//....

 

Se apenas estás a consultar alguma informação, e se a BD não tiver muitos registos, o código acima é suficientemente rápido mas o melhor é fazeres a query em background, por exemplo com AsyncThread, https://developer.android.com/reference/android/os/AsyncTask.html

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.