sql >> データベース >  >> RDS >> Mysql

PHPからJSONオブジェクトを返してAndroidアプリから読み取る方法

    あなたの投稿は動作するPHPファイルについて言及していないので、完全を期すためにそれを含めます。これは長くなる可能性があります(長い )投稿....

    だから、最初に。これは、 my_test.phpという名前で保存されているPHPファイルの例です。 次の場所にあります:c:\wamp\www\some_folder_name\my_test.phpコードの編集履歴をご覧ください

    それでは、このPHPの重要な部分について説明しましょう。これらのパラメータは、設定を使用するように構成する必要があります:

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

    IPアドレスは、ローカルホストまたはMySQLデータベースをホストしているコンピューターのIPアドレスのいずれかである必要があります。物理デバイスでテストできるように、できればIPアドレス。 localhostを使用する 仮想デバイスでのみ機能します。

    次は、単一のレコード()を構成する配列に列を追加します。 )JSON応答で。たとえば、次の行を見てください。

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

    $stuff["id"] 基本的にタグになります 結果のJSONオブジェクトでは、$row['id'] DBのテーブルの列名を示すものです。したがって、$row["...."] DBテーブルの列名と同じである必要があります。 $stuff["...."] ほぼ何でもかまいません。それがあなたにとって理にかなっている限り。

    この行はecho(json_encode($response)); 変換 JSON形式への応答。

    次に、Javaコードを見てみましょう。最初に、結果を解析するのに役立つクラスがあります。ウェブサイトのチュートリアルから外されました(どちらか覚えていません )。次のコードをコピーしてJavaクラスに貼り付けます。このファイルの内容を変更する必要はありません。それがどのように機能するかを理解するためにそれをよく読んでください。 JSONParserという名前にしました (コードの編集履歴をご覧ください ):

    最後に、結果のJSONを実際に取得し、Activityで解析する方法 /Fragment

    AsyncTaskのデータを解析します 、これは、ネットワーク操作を実行することを考慮してとにかく必要です。 (コードの編集履歴をご覧ください

    このJavaで注意すべき点:

    1. このString URL_TO_PHP = "http://IP_ADDRESS/some_folder_name/my_test.php"; 192.168.0.xなどのIPアドレスが必要です または、仮想デバイスでテストする場合は、 10.0.2.2である必要があります 。以前( 192 .. )エミュレータ以降では機能しません( 10.0 ... )物理デバイスでは機能しません。
    2. この場合:String TAG_STUFF = "stuff";"stuff" PHPファイルからのこれに対応します:$response["stuff"] = array();TAG_STUFF 基本的に$response["stuff"]のwhatsを使用する必要があります 。

    上記のすべてが理にかなっていることを願っています。ヘルプが必要な場合はコメントしてください。;-)

    実用的なソリューションで更新:

    これは確かに非常に奇妙です。しかし、私には実用的な解決策があります。 OPのコードを使用すると、アプリケーションが実際にクラッシュします。クラッシュする理由をテストする時間がないため、代わりにソリューションを直接投稿しています。

    まず、testingを維持する代わりに 独立したクラスとして、MainActivityに戻って内部クラスとして作成します 。

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

    次に、変数をグローバルに宣言します( jParserURL_TO_PHP 、など )、onPreExecute()の前の現在の宣言に対して 。明確にするために、以下の完全なソリューションを参照してください...

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

    テスト中、私は結果のスクリーングラブも取りました。ここにあります:

    繰り返しになりますが、私は現在少し痩せているので、OPのコードでクラッシュを実際に引き起こしている原因を突き止めることができません。しかし、それを見つけるには十分に興味をそそられます。



    1. MySQL select join where AND where

    2. MySQLでコミットされていないデータを取得する

    3. ORA-00997の回避策:LONGデータ型の不正使用

    4. SQL Server(T-SQL)のパーティション関数のパラメータータイプを確認します