>

Fórum

Fórum da RL System, voltado para analistas, programadores etc. Tudo sobre linguagem de programação e desenvolvimento Full Stack: Banco de Dados, Android, C#, Java, .NET, PHP, Node, Javascript, TypeScript, Front, HTML e muito mais.



Consulta a um BD Mysql na web


Nas video aulas somente ensina como passar os dados para o banco Mysql queria saber se alguem pode me ajudar na captura dos dados no servidor mysql e mostra-los na aplicação



16 Respostas


adicione uma query com a busca na aplicacao




Cara, para utilizar mysql eu custumo utilizar Json. Talvez também funcione pra você.




Também tenho esta duvida. Alguém tem algum exemplo pratico de como usar essa integração de android com mysql??




Pessoal,

Basta fazer um consulta no banco de dados, por exemplo, via PHP. Igual ao curso que temos aqui no portal, de Android Online e Android Best Practices.

Antes de exibir eles, codifica para JSON.

No Android, basta chamar via HTTP e decodificar o JSON.

Links que podem auxiliar:

http://php.net/manual/en/function.json-encode.php

Eu desenvolvi um exemplo para vocês, segue o link abaixo:

http://rlsystem.com.br/forum/disco/Exemplo-JSON-PHP-Android.rar

Os arquivos principais do exemplo em Android são: MainActivity.java e ClientAdapter.java

E no exemplo abaixo, seria seu PHP, que iria retornar os dados via JSON. Esse seria chamado via Android.



$conn = mysql_connect("localhost", "root", "");
$db = mysql_select_db("estoque");
$sth = mysql_query("SELECT * FROM produtos");

$rows = array();

while($r = mysql_fetch_assoc($sth)) {
$rows[] = $r;
}

print json_encode($rows);



PS: recomendo que utilizem a PDO do PHP, já que é uma biblioteca mais robusta para conexão a banco de dados, de qualquer forma, o exemplo funciona igual.




Rafael,

A forma mais utilizada hoje em dia pra comunicação de um banco externo como SQLite é este processo em PHP.... ? Ou acha melhor o uso talvez de webservices?? Qual sua opnião?




[quote]
Rafael,

A forma mais utilizada hoje em dia pra comunicação de um banco externo como SQLite é este processo em PHP.... ? Ou acha melhor o uso talvez de webservices?? Qual sua opnião?
[/quote]

Bruno,

As duas formas são válidas, usando via JSON (PHP) ou via Web Services. A primeira é mais simples e mais fácil.




Rafael,

Criei no meu projeto a classe ClientAdapter


import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Environment;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class ClienteAdapater extends BaseAdapter {

private Context ctx;
JSONArray jsonArray;

public ClienteAdapater(Context ctx) {
this.ctx = ctx;

String readHttp = readHttp();

try {
jsonArray = new JSONArray(readHttp);
} catch (Exception e) {
e.printStackTrace();
}

}

public String readHttp() {
StringBuilder builder = new StringBuilder();
HttpClient client = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://brunomartins.com.br/php/select_exames.php");
try {
HttpResponse response = client.execute(httpGet);
StatusLine statusLine = response.getStatusLine();
int statusCode = statusLine.getStatusCode();
if (statusCode == 200) {
HttpEntity entity = response.getEntity();
InputStream content = entity.getContent();
BufferedReader reader = new BufferedReader(
new InputStreamReader(content));
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
} else {
Log.e(Main.class.toString(), "Erro ao ler JSON!");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return builder.toString();
}

public int getCount() {
return jsonArray.length();
}

public Object getItem(int position) {
JSONObject ob = null;
try {
ob = jsonArray.getJSONObject(position);
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

return ob;
}

public long getItemId(int arg0) {
return 0;
}

public View getView(int position, View view, ViewGroup arg2) {

LayoutInflater layout = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View v = layout.inflate(R.layout.model_clientes, null);

try {
JSONObject obj = (JSONObject) getItem(position);

TextView textView1 = (TextView) v.findViewById(R.id.textView1);
textView1.setText(obj.getString("acesso_number"));

TextView textView2 = (TextView) v.findViewById(R.id.textView2);
textView2.setText(obj.getString("descricao"));
} catch (Exception ex) {

}

return v;
}
}




Tenho no meu layout inicial um botão no qual eu gostaria de rodar este processo de buscar no banco e popular a tabela no android.


public void BuscaExames(View v){
Toast. makeText(Main.this, "teste", Toast.LENGTH_LONG).show();
return;


}



Estou com duvida como devo fazer pra startar esta classe.


Obrigado pela atenção




Opa Bruno.

Basta adicionar um ListView no projeto, recuperar ele e no setAdapater, passar a instância da classe ClienteAdapater.

Algo assim:


ListView ltwClientes = findViewById(R.id.ID_DO_SEU_LISTVIEW);
ltwClientes.setAdapter(new ClienteAdapater(getBaseContext()));




Rafael,

Obrigado pela atenção.

Como teste, criei um campo texto simples onde pega o método do getCount do ClienteAdapater e colocar em um campo abaixo quando clicado no botão.

Fiz desta forma


public void BuscaExames(View v){

TextView count = (TextView) findViewById(R.id.count);
count.setText(new ClienteAdapater(getBaseContext()).getCount());

Toast. makeText(Main.this, "teste", Toast.LENGTH_LONG).show();
return;


}


A aplicação fecha, aparece " Nucleomamografia parou" e fecha


Tentei apenas instanciar esta classe no click do botão...


public void BuscaExames(View v){

ClienteAdapater ca = new ClienteAdapater(getBaseContext());

Toast. makeText(Main.this, "teste", Toast.LENGTH_LONG).show();
return;


}


Acontece o mesmo erro.


Será algum problema no meu php ??


$link = mysql_connect('localhost', 'brunomartins', '147258');
if (!$link) {
die('Não foi possível conectar: ' . mysql_error());
}



$db_selected = mysql_select_db('nucleomamografia', $link);
if (!$db_selected) {
die ('Can\'t use foo : ' . mysql_error());
}



$SQL = "SELECT distinct exame.exame_id,
exame.acesso_number,
exame.data,
exame.descricao
FROM aluno_exame,
exame
WHERE aluno_exame.exame = exame.exame_id
AND aluno_exame.aluno = 1";



$sth = mysql_query($SQL);


$rows = array();

while($r = mysql_fetch_assoc($sth)){
$rows[] = $r;
}

print json_encode($rows);

//mysql_close($link);


?>



quando executo, me tras resultado pelo menos.

http://brunomartins.com.br/php/select_exames.php


Bom, por fim, o que eu quero fazer nem é colocar em um listView... quero pegar estar informações e inserir em um tabela do SQLite.

quando puder me ajude....


Obrigado mais uma vez




Opa

Faça o teste novamente.

Quando der o erro, copia todo o log do logcat e cole aqui.

No aguardo




Opa... ai esta o Logcat....

http://rlsystem.com.br/forum/disco/uploads/63f7c45fae2e1fa8788990ce859b5379-logcat.txt


Valeu




Opa

Faz o seguinte.

Muda tem readhttp (seu método), para o exemplo daqui:

http://rlsystem.com.br/forum/disco/Exemplo-JSON-PHP-Android.rar




Então... mas o meu método esta igual a este ai... eu copiei exatamente deste seu examplo, só mudei o caminho do PHP.

Estive pesquisando no google agora e vi que este erro dá porque estou tentando fazer um processo longo no método Main, quanto é com android 4, versões anteriores aceitavam. Vi em alguns sites e achei um legal com 3 soluções... usei a segunda por enquanto.... abrindo uma thread para instanciar uma classe... assim...


public void BuscaExames(View v){

new Thread(new Runnable()
{
public void run() {

ClienteAdapater ca = new ClienteAdapater(getBaseContext());
ca.populaExame();

}
}).start();

return;


}



acredito que ai estou populando o JSONArray pois debugando vi estava parando a aplicação nesta linha


HttpResponse response = client.execute(httpGet);


e após fazer desta forma passou por ela.... o site que me auxiliou foi esta aqui

http://blog.vandersonguidi.com.br/android/resolvendo-o-erro-networkonmainthreadexception-no-desenvolvimento-android


Agora o seguinte, só preciso confirmar se meu objeto JSONArray esta populado.... e preciso fazer um loop nele pra gerar as inserções na tabela....

Como faço um loop no objeto JSONArray e pego seus valores...??


Obrigado mais uma vez




Opa

Confesso que não entendi a questão que você alterou. Na verdade era pra funcionar igual.

O que você fez foi criar uma thread para isolar este processo e deixar a activity livre.

Inclusive você pode por uma barra de progresso dentro dela.

Quanto a fazer um loop no array é simples.

Você precisa pegar a string de retorno e atribuir a um JSONArray.

Veja:


// Ali em RESULT deve colocar a string de retorno do http
JSONArray jsonArray = new JSONArray(RESULT);

for (int i = 0; i < jsonArray.length(); i ) {
JSONObject jsonObject = jsonArray.getJSONObject(i);

// Para pegar um valor
jsonObject.getString("NOMEDOCAMPO");
}

// Dentro do JsonArray você tem vários JSONObject.


Qualquer dúvida fico a disposição

Até mais!!!




Show....

Deu certo...valeu pela ajuda.... pelo que falam o erro NetworkOnMainThreadException é por nas versões novas do android não poder fazer operações que demoram muito ... bom por fim... acho que é isso.. usando a thead funcionou....

Deu certo também o loop... valeu.. agora vou testar incluir nas tabelas dos SQLite... que acho que não é complicado não.... qualquer coisa eu grito dinovo....


Valeu pela ajuda...

Abraços....




Opa Bruno,

Perfeito.

Na verdade é sempre bom usar as Thread, principalmente para não testarmos a paciência do usuário e fazer ele travar a aplicação.

Além de ser uma boa prática.

Se possível, poste seu código ao pessoal, irá ajudar depois outras pessoas.

Até mais.