Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak zwrócić obiekt JSON z PHP do odczytu z aplikacji na Androida?

Ponieważ Twój post nie wspomina o działającym pliku PHP, dołączę go ze względu na kompletność. To może potrwać długo (długo ) post....

Więc po pierwsze. To jest przykład pliku PHP, który jest przechowywany pod nazwą my_test.php w tej lokalizacji:c:\wamp\www\some_folder_name\my_test.php (Zobacz historię edycji kodu )

Teraz pozwól mi wyjaśnić ważne części tego PHP. Te parametry należy skonfigurować tak, aby korzystały z Twoich ustawień:

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

Adres IP powinien być adresem localhost lub adresem IP komputera, na którym znajduje się baza danych MySQL. Najlepiej adres IP, aby można było testować na urządzeniach fizycznych. przy użyciu localhost działałby tylko na urządzeniach wirtualnych.

Następnym krokiem jest dodanie kolumn do tablicy, która utworzy pojedynczy rekord (wiersz ) w odpowiedzi JSON. Spójrz na ten wiersz na przykład:

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

$stuff["id"] zasadniczo stanie się tagiem w wynikowym obiekcie JSON, podczas gdy $row['id'] jest tym, co wskazuje nazwę kolumny z tabeli bazy danych. Więc $row["...."] musi być identyczna z nazwami kolumn w tabeli DB. Podczas gdy $stuff["...."] może być praktycznie wszystkim. O ile ma to dla Ciebie sens.

Ten wiersz echo(json_encode($response)); dokona konwersji odpowiedź w formacie JSON.

Teraz spójrzmy na kod Java. Najpierw jest klasa, która pomoże ci przeanalizować wynik. Został usunięty z samouczka ze strony internetowej (Nie pamiętam, który ). Po prostu skopiuj i wklej następujący kod w klasie Java. Nie musisz nic zmieniać w tym pliku. Przeczytaj go dobrze, aby zrozumieć, jak to działa. Nazywam się JSONParser (Zobacz historię edycji kodu ):

Na koniec, jak faktycznie uzyskać wynikowy JSON i przeanalizować go w Activity? / Fragment .

Analizuję dane w AsyncTask , co i tak jest wymagane, biorąc pod uwagę, że będziesz wykonywać operację sieciową. (Zobacz historię edycji kodu )

Wskazówki do odnotowania w tej Javie:

  1. Ten String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; musi mieć adres IP, taki jak 192.168.0.x lub jeśli testujesz na urządzeniu wirtualnym, powinien to być 10.0.2.2 . Wcześniejszy (192.. ) nie będzie działać na emulatorze, a później (10.0... ) nie będzie działać na urządzeniu fizycznym.
  2. W tym:String TAG_STUFF = "stuff"; , "stuff" odpowiada temu z pliku PHP:$response["stuff"] = array(); . TAG_STUFF powinien zasadniczo używać whats w $response["stuff"] .

Mam nadzieję, że powyższe ma sens. Skomentuj, jeśli potrzebujesz pomocy.;-)

ZAKTUALIZOWANE ROZWIĄZANIEM ROBOCZYM:

To naprawdę bardzo dziwne. Ale mam działające rozwiązanie. Podczas korzystania z kodu OP aplikacja rzeczywiście ulega awarii. Z braku czasu na sprawdzenie, dlaczego się zawiesza, zamiast tego publikuję rozwiązanie bezpośrednio.

Po pierwsze, zamiast trzymać testing jako niezależną klasę, utwórz ją jako klasę wewnętrzną z powrotem w MainActivity .

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

Po drugie, zadeklaruj zmienne globalnie (jParser , URL_TO_PHP itp. ), w stosunku do aktualnych deklaracji przed onPreExecute() . Zobacz kompletne rozwiązanie poniżej dla jasności...

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

Podczas testów zrobiłem też zrzut ekranu z wynikami. Oto on:

Ponownie, ponieważ jestem trochę rozciągnięty w tej chwili, nie będę w stanie dowiedzieć się, co tak naprawdę powoduje awarię w kodzie OP. Ale to wystarczająco intrygujące, aby się dowiedzieć...



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Java łączy się z Cloud SQL 2. generacji z maszyny wirtualnej zarządzanej przez Appengine

  2. Konwersja MySQL między dwoma formatami daty

  3. Jak wykonać cichą instalację mysql w inno setup?

  4. Czy istnieje sposób na poznanie Twojej aktualnej nazwy użytkownika w mysql?

  5. Jak mogę przekazać tablicę parametrów PDO, a jednocześnie określić ich typy?