728x90
Maria DB ↔ PHP ↔ Android 연동하기 - 4. JSON 파싱하기를 안보셨다면 먼저 보시는 것을 추천드립니다.
전 포스팅에서는 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
728x90
'Programming > Android' 카테고리의 다른 글
안드로이드 스튜디오 TableLayout 사용하기 (0) | 2020.03.31 |
---|---|
Maria DB ↔ PHP ↔ Android 연동하기 - 4. JSON 파싱하기 (0) | 2020.03.22 |
안드로이드 스튜디오 구글 맵의 범위 안에만 마커 사용하기 (6) | 2020.03.10 |
안드로이드 스튜디오 구글 맵 마커 묶어보여주기(클러스터 사용하기) (0) | 2020.03.09 |
안드로이드 스튜디오 구글 맵에 마커 넣기 (15) | 2020.03.09 |