sql >> Databáze >  >> RDS >> Mysql

Jak vrátit objekt JSON z PHP ke čtení z aplikace pro Android

Vzhledem k tomu, že se ve vašem příspěvku nezmiňuje funkční soubor PHP, pro úplnost jej uvedu. Může to být dlouhé (dlouhé ) příspěvek....

Takže za prvé. Toto je příklad souboru PHP, který je uložen pod názvem my_test.php v tomto umístění:c:\wamp\www\some_folder_name\my_test.php (Prohlédněte si historii úprav kódu )

Nyní mi dovolte vysvětlit důležité části tohoto PHP. Tyto parametry by měly být nakonfigurovány pro použití vašich nastavení:

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

IP adresa by měla být buď localhost, nebo IP adresa počítače, který je hostitelem databáze MySQL. Nejlépe IP adresu, abyste mohli testovat na fyzických zařízeních. pomocí localhost bude fungovat pouze na virtuálních zařízeních.

Dalším krokem je přidání sloupců do pole, které vytvoří jeden záznam (řádek ) v odpovědi JSON. Podívejte se například na tento řádek:

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

$stuff["id"] se v podstatě stane tag ve výsledném objektu JSON, zatímco $row['id'] je to, co označuje název sloupce z tabulky vaší DB. Takže $row["...."] musí být shodné s názvy sloupců v DB tabulce. Zatímco $stuff["...."] může být prostě cokoliv. Dokud vám to dává smysl.

Tento řádek echo(json_encode($response)); převede odpověď do formátu JSON.

Nyní se podívejme na kód Java. První v této třídě je třída, která vám pomůže analyzovat výsledek. Byl stažen z výukového programu z webové stránky (Nepamatuji si který ). Stačí zkopírovat a vložit následující kód do třídy Java. V tomto souboru není třeba nic měnit. Dobře si to přečtěte, abyste pochopili, jak to funguje. Mám to pojmenované JSONParser (Prohlédněte si historii úprav kódu ):

Nakonec, jak vlastně získat výsledný JSON a analyzovat ho v Activity / Fragment .

Analyzuji data v AsyncTask , což je každopádně vyžadováno vzhledem k tomu, že budete provádět síťovou operaci. (Prohlédněte si historii úprav kódu )

Body k poznámce v této Java:

  1. Tento String URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; musí mít buď IP adresu, například 192.168.0.x nebo pokud testujete na virtuálním zařízení, mělo by to být 10.0.2.2 . Dřívější (192.. ) nebude fungovat na emulátoru a novějším (10.0... ) nebude fungovat na fyzickém zařízení.
  2. V tomto:String TAG_STUFF = "stuff"; , "stuff" odpovídá tomu ze souboru PHP:$response["stuff"] = array(); . TAG_STUFF by měl v zásadě používat to, co je v $response["stuff"] .

Doufám, že vše výše uvedené dává smysl. Pokud potřebujete pomoc, napište komentář.;-)

AKTUALIZOVÁNO O PRACOVNÍ ŘEŠENÍ:

To je opravdu velmi zvláštní. Ale mám funkční řešení. Při použití kódu OP aplikace skutečně spadne. Z důvodu nedostatku času na testování, proč havaruje, místo toho posílám řešení přímo.

Za prvé, místo ponechání testing jako nezávislou třídu ji vytvořte jako vnitřní třídu zpět v MainActivity .

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

Za druhé, deklarujte proměnné globálně (jParser , URL_TO_PHP , atd ), oproti aktuálním deklaracím před onPreExecute() . Pro přehlednost si prohlédněte kompletní řešení níže...

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

Při testování jsem také pořídil snímek obrazovky s výsledky. Tady to je:

Opět, protože jsem v tuto chvíli trochu natažený, nebudu schopen zjistit, co skutečně způsobuje pád v kódu OP. Ale je to dost zajímavé, abych to zjistil..



  1. Představujeme novou funkci – Spotlight Cloud Replication

  2. Náhodně odebraná postgres výchozí oprávnění superuživatele - mohu je získat zpět?

  3. Slick 2.0 Generic CRUD operace

  4. Funkce SYS_EXTRACT_UTC() v Oracle