Mysql
 sql >> Datenbank >  >> RDS >> Mysql

So geben Sie ein JSON-Objekt von PHP zurück, um es von der Android-App zu lesen

Da Ihr Beitrag keine funktionierende PHP-Datei erwähnt, füge ich sie der Vollständigkeit halber hinzu. Dies könnte eine lange (lange ) posten....

So zuerst. Dies ist ein Beispiel für eine PHP-Datei, die unter dem Namen my_test.php gespeichert ist in an diesem Ort:c:\wamp\www\some_folder_name\my_test.php (Siehe den Bearbeitungsverlauf für den Code )

Lassen Sie mich nun die wichtigen Teile dieses PHP erklären. Diese Parameter sollten konfiguriert werden, um Ihre Einstellungen zu verwenden:

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

Die IP-Adresse sollte entweder localhost oder die IP-Adresse des Computers sein, der die MySQL-Datenbank hostet. Vorzugsweise eine IP-Adresse, damit Sie auf physischen Geräten testen können. mit localhost würde nur auf virtuellen Geräten funktionieren.

Als nächstes fügen Sie die Spalten zu einem Array hinzu, das einen einzelnen Datensatz (Zeile ) in der JSON-Antwort. Sehen Sie sich zum Beispiel diese Zeile an:

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

Der $stuff["id"] wird im Grunde zum Tag im resultierenden JSON-Objekt, während $row['id'] gibt den Spaltennamen aus der Tabelle Ihrer DB an. Also die $row["...."] muss mit den Spaltennamen in der DB-Tabelle identisch sein. Während $stuff["...."] kann so ziemlich alles sein. Solange es für Sie sinnvoll ist.

Diese Zeile echo(json_encode($response)); wird konvertieren die Antwort in ein JSON-Format.

Schauen wir uns nun den Java-Code an. Als Erstes gibt es eine Klasse, die Ihnen hilft, das Ergebnis zu analysieren. Es wurde aus einem Tutorial von einer Website entnommen (ich weiß nicht mehr, welches ). Kopieren Sie einfach den folgenden Code und fügen Sie ihn in eine Java-Klasse ein. In dieser Datei muss nichts geändert werden. Lesen Sie es gut durch, um zu verstehen, wie es funktioniert. Ich habe es JSONParser genannt (Siehe den Bearbeitungsverlauf für den Code ):

Schließlich, wie würde man den resultierenden JSON tatsächlich erhalten und ihn in einer Activity parsen? / Fragment .

Ich parse die Daten in einer AsyncTask , was ohnehin erforderlich ist, wenn man bedenkt, dass Sie eine Netzwerkoperation durchführen. (Siehe den Bearbeitungsverlauf für den Code )

Zu beachtende Punkte in diesem Java:

  1. Dieser String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; muss entweder eine IP-Adresse wie 192.168.0.x haben oder wenn Sie auf einem virtuellen Gerät testen, sollte es 10.0.2.2 sein . Je früher (192.. ) funktioniert nicht auf einem Emulator und neuer (10.0... ) funktioniert nicht auf einem physischen Gerät.
  2. In this:String TAG_STUFF = "stuff"; , das "stuff" entspricht dem aus der PHP-Datei:$response["stuff"] = array(); . Der TAG_STUFF sollte grundsätzlich verwenden, was in $response["stuff"] steht .

Hoffe, das alles macht Sinn. Kommentieren Sie, wenn Sie Hilfe benötigen.;-)

AKTUALISIERT MIT FUNKTIONIERENDER LÖSUNG:

Das ist wirklich sehr seltsam. Aber ich habe eine funktionierende Lösung. Bei Verwendung des OP-Codes stürzt die Anwendung tatsächlich ab. Aus Zeitmangel, um zu testen, warum es abstürzt, poste ich stattdessen direkt eine Lösung.

Erstens, anstatt weiter testing als unabhängige Klasse erstellen Sie es als innere Klasse zurück in der MainActivity .

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

Zweitens deklarieren Sie die Variablen global (der jParser , URL_TO_PHP , usw ), im Gegensatz zu den aktuellen Deklarationen vor onPreExecute() . Sehen Sie sich zur Verdeutlichung die vollständige Lösung unten an...

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

Während des Tests habe ich auch einen Screenshot der Ergebnisse gemacht. Hier ist es:

Da ich im Moment etwas dünn bin, kann ich noch einmal nicht herausfinden, was wirklich den Absturz im OP-Code verursacht. Aber es ist faszinierend genug, es herauszufinden..