Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como retornar o objeto JSON do PHP para ler do aplicativo Android


Como você postou não menciona um arquivo PHP funcional, vou incluí-lo por uma questão de completude. Este pode ser um longo (longo ) publicar....

Então, primeiro. Este é um exemplo de um arquivo PHP que é armazenado com o nome my_test.php neste local:c:\wamp\www\some_folder_name\my_test.php (Veja o histórico de edição do código )

Agora, deixe-me explicar as partes importantes deste PHP. Esses parâmetros devem ser configurados para usar suas configurações:
$DB_HOST = 'YOUR_IP_ADDRESS';
$DB_UNAME = 'MYSQL_USERNAME';
$DB_PWD = 'MYSQL_USER'S_PASSWORD';
$DB_DATABASE = 'DATABASE_NAME';

O endereço IP deve ser localhost ou o endereço IP do computador que hospeda o banco de dados MySQL. De preferência um endereço IP para que você possa testar em dispositivos físicos. usando localhost funcionaria apenas em dispositivos virtuais.

O próximo passo é adicionar as colunas a um array que irá construir um único registro (linha ) na resposta JSON. Dê uma olhada nesta linha por exemplo:
$stuff["id"] = $row['id'];

O $stuff["id"] basicamente se tornará a tag no objeto JSON resultante, enquanto o $row['id'] é o que indica o nome da coluna da tabela do seu banco de dados. Portanto, o $row["...."] deve ser idêntico aos nomes das colunas na tabela DB. Enquanto o $stuff["...."] pode ser qualquer coisa. Desde que faça sentido para você.

Esta linha echo(json_encode($response)); irá converter a resposta em um formato JSON.

Agora vamos ver o código Java. Em primeiro lugar, há uma classe que o ajudará a analisar o resultado. Foi retirado um tutorial de um site (não lembro qual ). Basta copiar e colar o seguinte código em uma classe Java. Não há necessidade de alterar nada neste arquivo. Dê uma boa leitura para entender como ele funciona. Eu o nomeei JSONParser (Veja o histórico de edição do código ):

Finalmente, como obter o JSON resultante e analisá-lo em uma Activity / Fragment .

Eu analiso os dados em um AsyncTask , que é necessário de qualquer maneira, considerando que você estará executando uma operação de rede. (Veja o histórico de edição do código )

Pontos a serem observados neste Java:
  1. Esta String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; precisa ter um endereço IP como 192.168.0.x ou se você estiver testando em um dispositivo virtual, deve ser 10.0.2.2 . Quanto mais cedo (192.. ) não funcionará em um emulador e o posterior (10.0... ) não funcionará em um dispositivo físico.
  2. Neste:String TAG_STUFF = "stuff"; , o "stuff" corresponde a isso do arquivo PHP:$response["stuff"] = array(); . O TAG_STUFF deve basicamente usar o que está em $response["stuff"] .

Espero que tudo o que foi dito acima faça sentido. Comente se precisar de ajuda.;-)

ATUALIZADO COM SOLUÇÃO DE FUNCIONAMENTO:

Isso é muito estranho mesmo. Mas, eu tenho uma solução de trabalho. Ao usar o código do OP, o aplicativo realmente trava. Por falta de tempo para testar por que ele trava, estou postando uma solução diretamente.

Primeiro, em vez de manter testing como uma classe independente, crie-a como uma classe interna de volta ao MainActivity .
class testing extends AsyncTask<Void, Void, Void>   {
....
}

Segundo, declare as variáveis ​​globalmente (o jParser , URL_TO_PHP , etc ), em comparação com as declarações atuais antes do onPreExecute() . Veja a solução completa abaixo para maior clareza...
public class MainActivity extends Activity {

    JSONParser jParser;
    String URL_TO_PHP = "http://testbox.site50.net/test.php";
    String TAG_SUCCESS = "success";
    String TAG_STUFF = "stuff";

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

    ....

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.button1:
                new testing().execute();
                break;
            default:
                break;
        }

    }

    private class testing extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... args) {

            /* Building Parameters */
            List<NameValuePair> params = new ArrayList<>();

            /* getting JSON string from URL */
            JSONObject json = jParser.makeHttpRequest(URL_TO_PHP, "GET", params);

            try {
                /* Checking for SUCCESS TAG */
                int success = json.getInt(TAG_SUCCESS);
                if (success == 1) {
                    JSONArray JAStuff = json.getJSONArray(TAG_STUFF);

                    /** CHECK THE NUMBER OF RECORDS **/
                    int intStuff = JAStuff.length();

                    if (intStuff != 0) {

                        for (int i = 0; i < JAStuff.length(); i++) {
                            JSONObject JOStuff = JAStuff.getJSONObject(i);
                            Log.e("ALL THE STUFF", JOStuff.toString());
                        }
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
        }
    }
}

Durante o teste, também tirei uma captura de tela dos resultados. Aqui está:

Novamente, como estou um pouco esticado no momento, não poderei descobrir o que realmente está causando a falha no código do OP. Mas é intrigante o suficiente para descobrir ..