[RESOLVIDO] Ajuda com pesquisa SQL atravez de um btn Android
15 respostasResolvido
G
Guilherme_Castro
Boa tarde me chamo Guilherme de Castro , estou desenvolvendo um app para android aonde conecto diretamente a um banco de dados existente ( PostgreSQL ) .
estou recebendo o seguinte erro ao executar o sistema
java.lang.NullPointerException: Attempt to invoke interface method ‘int java.sql.CallableStatement.executeUpdate(java.lang.String)’ on a null object reference
segue abaixo as classes criadas :
Classe de Conexao ao Banco
packagecastro.conexaoDB;importandroid.util.Log;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.ResultSet;importjava.sql.Statement;publicclassBancoNovo{publicStringConectar(){Stringretorno=null;Stringurl;Connectionconn=null;try{Class.forName("org.postgresql.Driver");Log.e("#OK","Classe OK!!!");}catch(ClassNotFoundExceptione){retorno="Onde está o seu PostgreSQL Driver JDBC ? "+"Inclui a LIB no path !";e.printStackTrace();Log.e("#Erro Driver",e.getMessage());returnretorno;}try{url="jdbc:postgresql://192.168.5.132:5432/spacoeletro";DriverManager.setLoginTimeout(5);Log.e("#OK","Conectado Com Sucesso!!!");conn=DriverManager.getConnection(url,"postgres","1234");}catch(Exceptione){Log.e("#Erro JDBC",e.getMessage());retorno="Erro de conexão !!! - "+e.getMessage()+" ::004";}if(conn!=null){Log.e("#Conectado","PostgreSQL");retorno="Você fez isso, assumir o controle do banco de dados agora!";}returnretorno;}}
Classe MainActivity
packagecastro.conexaoDB;importandroidx.appcompat.app.AppCompatActivity;importandroid.content.DialogInterface;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.TextView;importandroid.widget.Toast;importjava.sql.CallableStatement;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassMainActivityextendsAppCompatActivity{privateStringnome;privateStringtelefone;privateEditTextnomeEdit;privateEditTextnomeTelefone;privateTextViewnomeResultado;privateStringsql;publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicStringgetTelefone(){returntelefone;}publicvoidsetTelefone(Stringtelefone){this.telefone=telefone;}BancoNovobn=newBancoNovo();Buttonb1;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);b1=(Button)findViewById(R.id.btnConsultar);b1.setOnClickListener(consultarBTN);nomeEdit=findViewById(R.id.editTextResultadoNome);nomeResultado=findViewById(R.id.editTextResultado);}publicvoidconsultar(Viewview)throwsSQLException,ClassNotFoundException{nome=nomeEdit.getText().toString();nomeResultado.setText("Nome: "+nome);buscar(nome);}View.OnClickListenerconsultarBTN=newView.OnClickListener(){publicvoidonClick(Viewview){nome=nomeEdit.getText().toString();nomeResultado.setText("Nome: "+nome);buscar(nome);}};publicvoidinicioDB(Viewview){Connectionc=null;try{conn();Toast.makeText(getApplicationContext(),"Conectado ao Banco",Toast.LENGTH_LONG).show();}catch(Exceptionex){Toast.makeText(getApplicationContext(),"Erro dentro do onclick "+ex.getMessage(),Toast.LENGTH_LONG).show();Log.e("#Erro onClick",ex.getMessage());Log.e("#String",sql);}}publicvoidconn(){bn.Conectar();}publicvoidbuscar(Stringnome){Connectionconn=null;bn.Conectar();sql=null;PreparedStatementpst=null;CallableStatementcst=null;try{//pst = conn.prepareStatement("select email from teste where nome='"+nome+"'");cst.executeUpdate("select email from teste where nome='"+nome+"'");}catch(SQLExceptionex){Log.e("Erro SQL",ex.getMessage());}}}
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/FieldTextNome"android:layout_width="wrap_content"android:layout_height="wrap_content"tools:context=".MainActivity"><LinearLayoutandroid:layout_width="409dp"android:layout_height="729dp"android:orientation="vertical"tools:layout_editor_absoluteX="1dp"tools:layout_editor_absoluteY="1dp"tools:ignore="MissingConstraints"><ImageViewandroid:id="@+id/imageView3"android:layout_width="match_parent"android:layout_height="wrap_content"app:srcCompat="@drawable/logohd"/><TextViewandroid:id="@+id/textViewNome"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Nome"/><EditTextandroid:id="@+id/editTextResultadoNome"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:hint="Digite o Nome"android:inputType="textPersonName"/><TextViewandroid:id="@+id/textViewResultado"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center"android:text="Resultado"/><EditTextandroid:id="@+id/editTextResultado"android:layout_width="match_parent"android:layout_height="wrap_content"android:ems="10"android:inputType="textPersonName"/><Buttonandroid:id="@+id/btnConsultar"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Consultar"/><Buttonandroid:id="@+id/btnTesteBanco"android:layout_width="match_parent"android:layout_height="wrap_content"android:onClick="inicioDB"android:text="Teste de Conexao Banco"/></LinearLayout></androidx.constraintlayout.widget.ConstraintLayout>
Acho q nao vai pq vc ta invalidando seus objetos, deixando eles nulos
sql=null;
PreparedStatement pst = null;
CallableStatement cst = null;
.....
cst.executeUpdate("select email from teste where nome='"+nome+"'");
Isso no metodo buscar(String nome)
G
Guilherme_Castro
alguma solução de como fazer?
pois se eu não inicializar eles ( PreparedStatement e o CallableStatement ) o IDE me sujere inicializar nulo.
R
rodriguesabner
Cara, o correto é você ter um backend separado da aplicação mesmo.
Nem sempre o que a IDE sugerir é o correto!
Vc teria que refazer toda sua classe de conexão, vc passo null pra um monte de variavel.
Eu tenho um exemplo usando Java Swing, não sei se vai servir pra vc, mas nao custa tentar
Se não der certo, volta aqui e da um feedback
G
Guilherme_Castro
ocorreu o seguinte erro ao executar o código abaixo
Attempt to invoke interface method ‘java.sql.Statement java.sql.Connection.createStatement(int, int)’ on a null object reference
W/System.err: java.lang.NullPointerException: Attempt to invoke interface method ‘java.sql.Statement java.sql.Connection.createStatement(int, int)’ on a null object reference
W/System.err: at castro.conexaoDB.BancoNovo.executaSQL(BancoNovo.java:62)
linha que esta dando o erro
stm = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
R
rodriguesabner
Cara, mostra como vc fez, e mostra sua classe de conexão.
G
Guilherme_Castro
Classe de conexao do banco
packagecastro.conexaoDB;importandroid.util.Log;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.ArrayList;importjava.util.List;publicclassBancoNovo{publicStatementstm;publicResultSetrs;publicConnectionconn;publicvoidConectar(){Stringretorno=null;Stringurl;Connectionconn=null;try{Class.forName("org.postgresql.Driver");Log.e("#OK","Classe OK!!!");}catch(ClassNotFoundExceptione){retorno="Onde está o seu PostgreSQL Driver JDBC ? "+"Inclui a LIB no path !";e.printStackTrace();Log.e("#Erro Driver",e.getMessage());//return retorno;}try{url="jdbc:postgresql://192.168.5.132:5432/spacoeletro";// se retirar essa linha do DriverManager ele da o seguinte erro Somethingunusualhasoccurredtocausethedrivertofail.Pleasereportthisexception.DriverManager.setLoginTimeout(60);Log.e("#OK","Conectado Com Sucesso!!!");conn=DriverManager.getConnection(url,"postgres","spaco0225");}catch(Exceptione){Log.e("#Erro JDBC",e.getMessage());retorno="Erro de conexão !!! - "+e.getMessage()+" ::004";}if(conn!=null){Log.e("#Conectado","PostgreSQL");retorno="Você fez isso, assumir o controle do banco de dados agora!";}//return retorno;}publicvoidexecutaSQL(StringSQL){try{stm=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);rs=stm.executeQuery(SQL);Log.e("#Statement",stm.toString());Log.e("#ResultSet",rs.toString());}catch(Exceptione){e.printStackTrace();Log.e("#Erro SQL",e.getMessage());}}publicResultSetquery(){//Connection c = this.Conectar();ResultSetrs=null;Dadosdata=newDados();List<Dados>ld=newArrayList<Dados>();try{Stringsql="Select * from teste";//PreparedStatement pst = c.prepareStatement(sql);//rs = pst.executeQuery();while(rs.next()){data.setNome(rs.getString("nome"));data.setEmail(rs.getString("email"));data.setEmail(rs.getString("telefone"));ld.add(data);Log.e("#ResultSet OK",rs.toString());}}catch(SQLExceptionex){Log.e("#Erro Result: ",ex.getMessage());}returnnull;}}
Classe MainActivity
packagecastro.conexaoDB;importandroidx.appcompat.app.AppCompatActivity;importandroid.content.DialogInterface;importandroid.os.Bundle;importandroid.util.Log;importandroid.view.View;importandroid.widget.Button;importandroid.widget.EditText;importandroid.widget.TextView;importandroid.widget.Toast;importjava.sql.CallableStatement;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;publicclassMainActivityextendsAppCompatActivity{privateStringnome;privateStringtelefone;privateEditTextnomeEdit;privateEditTextnomeTelefone;privateTextViewnomeResultado;privateStringsql;publicStringgetNome(){returnnome;}publicvoidsetNome(Stringnome){this.nome=nome;}publicStringgetTelefone(){returntelefone;}publicvoidsetTelefone(Stringtelefone){this.telefone=telefone;}BancoNovobn=newBancoNovo();Buttonb1;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);b1=(Button)findViewById(R.id.btnConsultar);b1.setOnClickListener(consultarBTN);nomeEdit=findViewById(R.id.editTextResultadoNome);nomeResultado=findViewById(R.id.editTextResultado);}/*public void consultar(View view) throws SQLException, ClassNotFoundException { nome = nomeEdit.getText().toString(); nomeResultado.setText("Nome: " + nome); buscar(nome); }*/View.OnClickListenerconsultarBTN=newView.OnClickListener(){publicvoidonClick(Viewview){nome=nomeEdit.getText().toString();nomeResultado.setText("Nome: "+nome);sql="select email from teste where nome='"+nome+"'";Log.e("String SQL",sql);//buscar(nome);query();}};publicvoidinicioDB(Viewview){Connectionc=null;try{conn();Toast.makeText(getApplicationContext(),"Conectado ao Banco",Toast.LENGTH_LONG).show();}catch(Exceptionex){Toast.makeText(getApplicationContext(),"Erro dentro do onclick "+ex.getMessage(),Toast.LENGTH_LONG).show();Log.e("#Erro onClick",ex.getMessage());Log.e("#String",sql);}}publicvoidconn(){bn.Conectar();}publicvoidbuscar(Stringnome){Connectionconn;bn.Conectar();//sql=null;PreparedStatementpst=null;CallableStatementcst=null;try{pst.executeUpdate("select email from teste where nome='"+nome+"'");//cst.executeUpdate("select email from teste where nome='"+nome+"'");}catch(SQLExceptionex){Log.e("Erro SQL",ex.getMessage());}}publicvoidquery(){//bn.Conectar();this.chamarMetodo();//bn.executaSQL(sql);//}privatevoidchamarMetodo(){BancoNovoconecta=newBancoNovo();conecta.Conectar();try{conecta.executaSQL("SELECT * FROM teste");while(conecta.rs.next()){Log.d("#Result: ",conecta.rs.getString("email"));//System.out.println(conecta.rs.getString("email"));}}catch(Exceptione){e.printStackTrace();}finally{//conecta.desconecta();}}}
R
rodriguesabner
mas cê ta deixando suas variaveis nulas ainda, copia o codigo q eu passei
G
Solucao aceita
Guilherme_Castro
OK acabou passando batido
deixei assim agora :
packagecastro.conexaoDB;importandroid.util.Log;importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.ArrayList;importjava.util.List;publicclassBancoNovo{publicStatementstm;publicResultSetrs;publicConnectionconn;publicStringretorno;publicStringurl;publicvoidConectar(){try{Class.forName("org.postgresql.Driver");Log.e("#OK","Classe OK!!!");}catch(ClassNotFoundExceptione){retorno="Onde está o seu PostgreSQL Driver JDBC ? "+"Inclui a LIB no path !";e.printStackTrace();Log.e("#Erro Driver",e.getMessage());//return retorno;}try{url="jdbc:postgresql://192.168.5.132:5432/spacoeletro";DriverManager.setLoginTimeout(60);Log.e("#OK","Conectado Com Sucesso!!!");conn=DriverManager.getConnection(url,"postgres","spaco0225");}catch(Exceptione){Log.e("#Erro JDBC",e.getMessage());retorno="Erro de conexão !!! - "+e.getMessage()+" ::004";}if(conn!=null){Log.e("#Conectado","PostgreSQL");retorno="Você fez isso, assumir o controle do banco de dados agora!";}//return retorno;}publicvoidexecutaSQL(StringSQL){try{stm=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);rs=stm.executeQuery(SQL);Log.e("#Statement",stm.toString());Log.e("#ResultSet",rs.toString());}catch(Exceptione){e.printStackTrace();Log.e("#Erro SQL",e.getMessage());}}publicResultSetquery(){//Connection c = this.Conectar();ResultSetrs=null;Dadosdata=newDados();List<Dados>ld=newArrayList<Dados>();try{Stringsql="Select * from teste";//PreparedStatement pst = c.prepareStatement(sql);//rs = pst.executeQuery();while(rs.next()){data.setNome(rs.getString("nome"));data.setEmail(rs.getString("email"));data.setEmail(rs.getString("telefone"));ld.add(data);Log.e("#ResultSet OK",rs.toString());}}catch(SQLExceptionex){Log.e("#Erro Result: ",ex.getMessage());}returnnull;}}
e veio o seguinte erro no log:
W/System.err: android.os.NetworkOnMainThreadException
W/System.err: at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1565)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:116)
at java.net.SocketOutputStream.write(SocketOutputStream.java:161)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at org.postgresql.core.PGStream.flush(PGStream.java:531)
at org.postgresql.core.v3.QueryExecutorImpl.sendSync(QueryExecutorImpl.java:1182)
W/System.err: at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:254)
at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:561)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:405)
at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:285)
at castro.conexaoDB.BancoNovo.executaSQL(BancoNovo.java:62)
at castro.conexaoDB.MainActivity.chamarMetodo(MainActivity.java:120)
at castro.conexaoDB.MainActivity.query(MainActivity.java:112)
at castro.conexaoDB.MainActivity$1.onClick(MainActivity.java:70)
at android.view.View.performClick(View.java:7870)
at android.widget.TextView.performClick(TextView.java:14966)
W/System.err: at android.view.View.performClickInternal(View.java:7839)
at android.view.View.access$3600(View.java:886)
at android.view.View$PerformClick.run(View.java:29363)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7857)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076)
W/System.err: java.lang.NullPointerException: println needs a message
at android.util.Log.println_native(Native Method)
at android.util.Log.e(Log.java:323)
at castro.conexaoDB.BancoNovo.executaSQL(BancoNovo.java:67)
at castro.conexaoDB.MainActivity.chamarMetodo(MainActivity.java:120)
at castro.conexaoDB.MainActivity.query(MainActivity.java:112)
at castro.conexaoDB.MainActivity$1.onClick(MainActivity.java:70)
at android.view.View.performClick(View.java:7870)
at android.widget.TextView.performClick(TextView.java:14966)
at android.view.View.performClickInternal(View.java:7839)
W/System.err: at android.view.View.access$3600(View.java:886)
at android.view.View$PerformClick.run(View.java:29363)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:237)
at android.app.ActivityThread.main(ActivityThread.java:7857)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1076)
R
rodriguesabner
joga isso no onCreate
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
G
Guilherme_Castro1 like
show veio os dados
E/#Conectado: PostgreSQL
E/#Statement: org.postgresql.jdbc3g.Jdbc3gStatement@a261835
E/#ResultSet: org.postgresql.jdbc3g.Jdbc3gResultSet@b96a4ca
D/#Result:: [email removido].b [email removido]
agora vou tratar o resultado desse resultset . Muito Obrigado