Psycop Posted November 27, 2016 at 10:55 PM Report Share #600895 Posted November 27, 2016 at 10:55 PM 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 Link to comment Share on other sites More sharing options...
Knitter Posted November 27, 2016 at 11:06 PM Report Share #600896 Posted November 27, 2016 at 11:06 PM 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. Link to comment Share on other sites More sharing options...
Psycop Posted November 27, 2016 at 11:46 PM Author Report Share #600898 Posted November 27, 2016 at 11:46 PM Que outros problemas poderei vir a ter? Qual seria a forma mais correcta de implementar uma pesquisa como a que pretendo' Cumps Link to comment Share on other sites More sharing options...
Knitter Posted November 27, 2016 at 11:53 PM Report Share #600899 Posted November 27, 2016 at 11:53 PM 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. 1 Report Link to comment Share on other sites More sharing options...
Psycop Posted November 28, 2016 at 12:05 AM Author Report Share #600900 Posted November 28, 2016 at 12:05 AM 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 Link to comment Share on other sites More sharing options...
HappyHippyHippo Posted November 28, 2016 at 09:52 AM Report Share #600904 Posted November 28, 2016 at 09:52 AM 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 Portugol Plus Link to comment Share on other sites More sharing options...
Knitter Posted November 28, 2016 at 10:49 AM Report Share #600908 Posted November 28, 2016 at 10:49 AM 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 Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now