◆ 무한한 가능성/& Android

[Android] (JSONArray, php) DB TEXT를 웹으로 추출하기

치로로 2010. 8. 4. 15:35

http://memy80.blog.me/100109026444


##  기본 환경

Apache, php, mysql 환경의 서버에서...

php로 mysql에 접속하여 가져온 데이터를 JSONArray 형식으로 파싱후

파싱된 문자열을 안드로이드로 보냄.


## PHP소스코드(convert_jason.php)

 <?

    // 데이터베이스 접속 문자열. (db위치, 유저 이름, 비밀번호)
    $connect=mysql_connect( "localhost", "UserID", "UserPassWord") or 
        die( "SQL server에 연결할 수 없습니다.");


   // 데이터베이스 선택

   mysql_select_db("데이터베이스명",$connect);


   // 세션 시작

   session_start();


   // 쿼리문 생성

   $sql = "select * from 테이블명 order by group_num desc, ord asc";


   // 쿼리 실행 결과를 $result에 저장
   $result = mysql_query($sql, $connect);

   // 반환된 전체 레코드 수 저장.

   $total_record = mysql_num_rows($result);


   // 전체 페이지 수 계산.....  ==> 필요 없을지도??

   if ($total_record % $scale == 0)   
         // $total_record를 $scale로 나눈 나머지 계산
      $total_page = floor($total_record/$scale);    
         // 나머지가 0일 때
   else
      $total_page = floor($total_record/$scale) + 1;
        // 나머지가 0이 아닐 때
 
   if (!$page)                 // 페이지번호($page)가 0 일 때
       $page = 1;              // 페이지 번호를 1로 초기화
 
   $start = ($page - 1) * $scale;     
      // 표시할 페이지($page)에 따라 $start 계산 

   $number = $total_record - $start;


   // JSONArray 형식으로 만들기 위해서...

   echo "[";


   // 반환된 각 레코드별로 JSONArray 형식으로 만들기.
   for ($i=$start; $i<$start+$scale && $i < $total_record; $i++)                   
   {
      // 가져올 레코드로 위치(포인터) 이동 
      mysql_data_seek($result, $i);      
      // 하나의 레코드 가져오기
      $row = mysql_fetch_array($result);

      // 년월일시분초 를 년월일만 표시되도록 변경(보기좋게;)

      $day = substr($row[regist_day], 0, 10);

      for ($j=0; $j<$row[depth]; $j++)


     // 변수 설명
    // $number  번호
    // $name   글쓴이 이름  
    // $id   글쓴이 아이디
    // $subject  글제목
    // $content  글내용
    // $day   날짜
    // $filename  첨부파일명
  

   // echo로 출력
   echo "{\"number\":$number,\"name\":\"$row[name]\",\"id\":\"$row[id]\",\"subject\":\"$row[subject]\",\"content\":\"$row[content]\",\"date\":\"$day\",\"filename\":\"$row[filename]\"}";


   // 마지막 레코드 이전엔 ,를 붙인다. 그래야 데이터 구분이 되니깐. 

   if($i<$total_record-1){
      echo ",";
   }
      $number--;
   }

   // JSONArray의 마지막 닫기
   echo "]";
?>


이 파일은 http://사이트명/convert_jason.php 로 실행시 화면에 출력되는 내용은 대강


[{"number":1,"name":"홍길동","id":"gdhong","subject":"1번글 제목","content":"1번글 내용입니다.","date":"2010-06-28","filename":"img1.jpg"},
 {"number":2,"name":"이순신","id":"leess","subject":"2번글 제목","content":"2번글 내용입니다.","date":"2010-07-05","filename":"img2.jpg"},
 {"number":3,"name":"강감찬","id":"kkchan","subject":"3번글 제목","content":"3번글 내용입니다.","date":"2010-05-05","filename":"img3.jpg"}]



## 안드로이드 소스코드


 - AndroidManifest.xml에 uses-permission인 android.permission.INTERNET  퍼미션 추가.

 package kr.or.ketti;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

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

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class JSONArrayTest extends Activity {
    EditText mResult;
 /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        mResult = (EditText)findViewById(R.id.result);

       
        Button btn = (Button)findViewById(R.id.parse);
        btn.setOnClickListener(new Button.OnClickListener(){

   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
   

    // 웹에서 Json 형식으로 만들어진 php문서 받아옴
    String Json = DownloadHtml("http://사이트명/convert_jason.php");
    Log.i("Json : " , Json);
    try{


     String Result = "글 목록: \n";
     JSONArray ja = new JSONArray(Json);
     for(int j=0; j<ja.length(); j++){
      JSONObject order = ja.getJSONObject(j);
      Result += "번호 : " + order.getInt("number") + " " +
          "이름 : " + order.getString("name") + " " +
          "아이디 : " + order.getString("id") + " " +
          "제목 : " + order.getString("subject") + " " +
          "내용 : " + order.getString("content") + " " +
          "날짜 : " + order.getString("date") + " " +
          "파일명 : " + order.getString("filename") + " " +
          "위도 : " + order.getString("latitude") + " " +
          "경도 : " + order.getString("longitude") + " " +
          "고도 : " + order.getString("altitude") + "\n\n";
     }
     mResult.setText(Result);
     
    } catch(JSONException e) {
     Toast.makeText(v.getContext(), e.getMessage(), Toast.LENGTH_LONG).show();
    }
   }
        });
    }
   
String DownloadHtml(String addr){
   StringBuilder jsonHtml = new StringBuilder();
   try{
      // 연결 url 설정
      URL url = new URL(addr);
      // 커넥션 객체 생성
      HttpURLConnection conn = (HttpURLConnection)url.openConnection();
      // 연결되었으면.
      if(conn != null){
         conn.setConnectTimeout(10000);
         conn.setUseCaches(false);
         // 연결되었음 코드가 리턴되면.
         if(conn.getResponseCode() == HttpURLConnection.HTTP_OK){
            BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), "EUC-KR"));

            for(;;){

                // 웹상에 보여지는 텍스트를 라인단위로 읽어 저장.  

                String line = br.readLine();

                if(line == null) break;

                // 저장된 텍스트 라인을 jsonHtml에 붙여넣음

                jsonHtml.append(line + "\n");

             }

          br.close();

       }

        conn.disconnect();

     }

   } catch(Exception ex){

      Toast.makeText(this, ex.getMessage(), Toast.LENGTH_LONG).show();

   }

   return jsonHtml.toString();

   }
}



## layout/main.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
 <Button
  android:id="@+id/parse"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:text="parse"
  />
 <EditText
  android:id="@+id/result"
     android:layout_width="fill_parent"
     android:layout_height="fill_parent"
     android:textSize="12dp"/>
</LinearLayout>

## 테스트 결과.




'◆ 무한한 가능성 > & Android' 카테고리의 다른 글

[Android] Developers Site  (0) 2010.08.10