sql >> Database >  >> RDS >> Mysql

Hoe JSON-object van PHP te retourneren om te lezen vanuit de Android-app

Aangezien je post geen werkend PHP-bestand vermeldt, zal ik het voor de volledigheid toevoegen. Dit kan een lange (lange ) plaatsen....

Dus eerst. Dit is een voorbeeld van een PHP-bestand dat is opgeslagen met de naam my_test.php in op deze locatie:c:\wamp\www\some_folder_name\my_test.php (Bekijk de bewerkingsgeschiedenis voor de code )

Laat me nu de belangrijke delen van deze PHP uitleggen. Deze parameters moeten worden geconfigureerd om uw instellingen te gebruiken:

$DB_HOST = 'YOUR_IP_ADDRESS';
$DB_UNAME = 'MYSQL_USERNAME';
$DB_PWD = 'MYSQL_USER'S_PASSWORD';
$DB_DATABASE = 'DATABASE_NAME';

Het IP-adres moet localhost zijn of het IP-adres van de computer die de MySQL-database host. Bij voorkeur een IP-adres zodat je kunt testen op fysieke apparaten. met behulp van localhost zou alleen werken op virtuele apparaten.

De volgende stap is het toevoegen van de kolommen aan een array die een enkele record zal construeren (rij ) in het JSON-antwoord. Kijk bijvoorbeeld eens naar deze regel:

$stuff["id"] = $row['id'];

De $stuff["id"] wordt in feite de tag in het resulterende JSON-object terwijl de $row['id'] is wat de kolomnaam uit de tabel van uw database aangeeft. Dus de $row["...."] moet identiek zijn aan de kolomnamen in de DB-tabel. Terwijl de $stuff["...."] kan van alles zijn. Zolang je het maar logisch vindt.

Deze regel echo(json_encode($response)); zal converteren het antwoord in een JSON-formaat.

Laten we nu eens kijken naar de Java-code. De eerste in deze is een klasse die u zal helpen het resultaat te ontleden. Het is overgenomen van een tutorial van een website (Ik weet niet meer welke ). Kopieer en plak de volgende code in een Java-klasse. U hoeft niets in dit bestand te wijzigen. Lees het goed door om te begrijpen hoe het werkt. Ik heb het met de naam JSONParser (Bekijk de bewerkingsgeschiedenis voor de code ):

Tot slot, hoe zou je de resulterende JSON daadwerkelijk kunnen krijgen en parseren in een Activity / Fragment .

Ik ontleed de gegevens in een AsyncTask , wat sowieso vereist is, aangezien u een netwerkbewerking gaat uitvoeren. (Bekijk de bewerkingsgeschiedenis voor de code )

Aandachtspunten in deze Java:

  1. Deze String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; moet een IP-adres hebben zoals 192.168.0.x of als u op een virtueel apparaat test, moet dit 10.0.2.2 . zijn . Hoe eerder (192.. ) werkt niet op een emulator en de latere (10.0... ) werkt niet op een fysiek apparaat.
  2. Hierin:String TAG_STUFF = "stuff"; , de "stuff" komt hiermee overeen uit het PHP-bestand:$response["stuff"] = array(); . De TAG_STUFF zou eigenlijk moeten gebruiken wat er in $response["stuff"] staat .

Hoop dat al het bovenstaande logisch is. Reageer als je hulp nodig hebt.;-)

BIJGEWERKT MET WERKENDE OPLOSSING:

Dit is inderdaad heel raar. Maar ik heb een werkende oplossing. Bij gebruik van de OP-code crasht de applicatie inderdaad. Bij gebrek aan tijd om te testen waarom het crasht, plaats ik in plaats daarvan rechtstreeks een oplossing.

Ten eerste, in plaats van testing te houden als een onafhankelijke klasse, maak het dan als een innerlijke klasse terug in de MainActivity .

class testing extends AsyncTask<Void, Void, Void>   {
....
}

Ten tweede, declareer de variabelen globaal (de jParser , URL_TO_PHP , enz. ), in tegenstelling tot de huidige verklaringen vóór de onPreExecute() . Zie de volledige oplossing hieronder voor meer duidelijkheid...

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);
        }
    }
}

Tijdens het testen heb ik ook een screenshot van de resultaten gemaakt. Hier is het:

Nogmaals, omdat ik op dit moment een beetje mager ben, zal ik niet in staat zijn om erachter te komen wat de crash in de OP-code echt veroorzaakt. Maar het is intrigerend genoeg om erachter te komen..



  1. Hilarische tweets over het leven van een DBA

  2. Installeer Oracle SQL Developer 19.1 op Mac OS met JDK 8

  3. Waarom krijg ik alle resultaten als ik een onderstrepingsteken in een LIKE-filter gebruik?

  4. 193:%1 is geen geldige Win32-toepassingsfout met een nieuwe Rails-toepassing