728x90

Maria DB ↔ PHP ↔ Android 연동하기 - 4. JSON 파싱하기를 안보셨다면 먼저 보시는 것을 추천드립니다.

 

Maria DB ↔ PHP ↔ Android 연동하기 - 4. JSON 파싱하기

Maria DB ↔ PHP ↔ Android 연동하기 - 3. 외부 접속 설정하기 를 안 보셨다면 먼저 보시는 것을 추천드립니다. Maria DB ↔ PHP ↔ Android 연동하기 - 3. 외부 접속 설정하기 Maria DB ↔..

1d1cblog.tistory.com

전 포스팅에서는 connect.php로 DB 테이블의 모든 값을 읽어 json 형식으로 되어있는 것을 어플에서 불러오는것을 해보았습니다.

 

이제 EditText로 원하는 값만 select하여 불러오는 것을 해보겠습니다.

 

안드로이드 코딩을 하기 전 새로운 php 파일을 만들어주겠습니다. 파일명은 select.php로 해주겠습니다.

 

tree_name이라는 변수에 어플로부터 받아온 값을 넣어주게 됩니다.

<?php
	$con=mysqli_connect("localhost","root","12345678","treemanage");
	mysqli_set_charset($con,"utf8");

	$tree_name = "'".$_POST['Data']."'";
	
	$query = "select * from tree where 이름 = ".$tree_name;
	$res = mysqli_query($con,$query);
	$result = array();
	
	while($row = mysqli_fetch_array($res)) {
		array_push($result,
			array("이름"=>$row[0],'카테고리'=>$row[1],'키워드'=>$row[2],'보유수량'=>$row[3],
					'주당가격'=>$row[4],'위치'=>$row[5],'특이사항'=>$row[6],'수고'=>$row[7],
					'근원직경'=>$row[8],'흉고직경'=>$row[9],'수관폭'=>$row[10],'수관길이'=>$row[11],
					'지하고'=>$row[12],'육종방법'=>$row[13],'입력시간'=>$row[14]));
	}
	echo json_encode(array("Tree"=>$result), JSON_UNESCAPED_UNICODE);
	mysqli_close($con);

?>

전포스팅과 마찬가지로 Manifest.xml에 인터넷 사용허가와 usesCleartextTraffic="true"를 추가해줍니다.

<uses-permission android:name="android.permission.INTERNET"/>
    <application
        ...
        android:usesCleartextTraffic="true">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

layout_main.xml 입니다. EditText로 나무 이름을 입력 후 버튼을 클릭하면 treeLocation TextView에 나무의 위치를 띄워주게 됩니다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="51dp"
        android:layout_marginLeft="51dp"
        android:layout_marginTop="347dp"
        android:text="검색하려는 나무의 이름 : " />

    <EditText
        android:id="@+id/editText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_marginStart="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="334dp"
        android:layout_toEndOf="@+id/textView"
        android:layout_toRightOf="@+id/textView"
        android:hint="나무 이름을 입력하세요" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginStart="163dp"
        android:layout_marginLeft="163dp"
        android:layout_marginTop="403dp"
        android:text="SELECT" />

    <TextView
        android:id="@+id/treeLocation"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/textView"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true"
        android:layout_marginStart="180dp"
        android:layout_marginLeft="180dp"
        android:layout_marginTop="102dp"
        android:text="나무위치" />

</RelativeLayout>

다음으로 MainActivity.java 입니다. 

 

코드에도 주석으로 남겨두었지만 String selectData에서 "Data="과 php의 post[ ]안의 'Data'이 같아야 합니다. 

package com.example.treemanagement;

import android.content.pm.ActivityInfo;
import android.os.AsyncTask;
import android.os.Handler;
import android.os.HandlerThread;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Editable;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    private TextView textView;
    private EditText editText;
    private Button button;
    private String jsonString;
    ArrayList<Tree> treeArrayList;      // 나무정보들을 저장할 ArrayList
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = (TextView) findViewById(R.id.treeLocation);
        editText = (EditText) findViewById(R.id.editText);
        button = (Button) findViewById(R.id.button);

        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final JsonParse jsonParse = new JsonParse();      // AsyncTask 생성
                jsonParse.execute("http://121.153.150.157:81/select.php");     // AsyncTask 실행
            }
        });
    }

    public class JsonParse extends AsyncTask<String, Void, String> {
        String TAG = "JsonParseTest";
        @Override
        protected String doInBackground(String... strings) {
            // execute의 매개변수를 받아와서 사용
            String url = strings[0];
            try {
                String selectData = "Data=" + editText.getText().toString();
                // 따옴표 안과 php의 post [ ] 안이 이름이 같아야 함
                URL serverURL = new URL(url);
                HttpURLConnection httpURLConnection = (HttpURLConnection) serverURL.openConnection();

                httpURLConnection.setReadTimeout(5000);
                httpURLConnection.setConnectTimeout(5000);
                httpURLConnection.setRequestMethod("POST");
                httpURLConnection.connect();

                OutputStream outputStream = httpURLConnection.getOutputStream();
                outputStream.write(selectData.getBytes("UTF-8"));
                outputStream.flush();
                outputStream.close();
                // 어플에서 데이터 전송

                int responseStatusCode = httpURLConnection.getResponseCode();

                InputStream inputStream;
                if(responseStatusCode == HttpURLConnection.HTTP_OK) {
                    inputStream = httpURLConnection.getInputStream();
                }
                else{
                    inputStream = httpURLConnection.getErrorStream();
                } // 연결 상태 확인

                InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
                BufferedReader bufferedReader = new BufferedReader(inputStreamReader);

                StringBuilder sb = new StringBuilder();
                String line;

                while((line = bufferedReader.readLine()) != null){
                    sb.append(line);
                }

                bufferedReader.close();
                Log.d(TAG, sb.toString().trim());

                return sb.toString().trim();        // 받아온 JSON 의 공백을 제거
            } catch (Exception e) {
                Log.d(TAG, "InsertData: Error ", e);
                return null;
            }
        }

        @Override
        protected void onPostExecute(String fromdoInBackgroundString) { // doInBackgroundString에서 return한 값을 받음
            super.onPostExecute(fromdoInBackgroundString);

            if(fromdoInBackgroundString == null)
                textView.setText("error");
            else {
                jsonString = fromdoInBackgroundString;
                treeArrayList = doParse();
                if(treeArrayList.size() == 0)   textView.setText("검색결과 없음");
                // 객체의 크기가 0일때는 검색 결과가 없을 때이므로 검색결과 없음 설정
                else textView.setText(treeArrayList.get(0).getLocation());
            }
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected void onProgressUpdate(Void... values) {
            super.onProgressUpdate(values);
        }

        @Override
        protected void onCancelled(String s) {
            super.onCancelled(s);
        }

        private ArrayList<Tree> doParse() {
            ArrayList<Tree> tmpTreeArray = new ArrayList<Tree>();
            try {
                JSONObject jsonObject = new JSONObject(jsonString);
                JSONArray jsonArray = jsonObject.getJSONArray("Tree");

                for(int i=0;i<jsonArray.length();i++) {
                    Tree tmpTree = new Tree();
                    JSONObject item = jsonArray.getJSONObject(i);
                    tmpTree.setName(item.getString("이름"));
                    ...

                    tmpTreeArray.add(tmpTree);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return tmpTreeArray;
        } // JSON을 가공하여 ArrayList에 넣음
    }
}

 

참고자료 : https://twinw.tistory.com/29

 

PHP활용(1) - DB에 데이터 넣기 with Android

일단 서버 환경을 구축하기 위해 APMSETUP을 설치합니다. APM SETUP이란 근사모에서 만든 아파치+PHP+MySQL의 통합 프로그램이며 한번에 설치 및 설정을 다해주기 때문에 편리함 프로그램입니다. 아래 주소로 가시..

twinw.tistory.com

 

728x90

+ Recent posts