티스토리 뷰

안드로이드와 mysql 연동시키는 방법은 상당히 복잡하다. 왜냐하면, 안드로이드에서 직접 mysql DB에 접속하는 것을 막아놨기 때문이다. 보안상 막았다고 한다.

안드로이드에서 바로 접속할 수 없어서 웹을 거쳐서 DB에 접속해야 한다. 이때 웹이란 PHP 나 JSP 같은 웹 프로그래밍언어를 사용한다. PHP가 간단하고 쉬워서 PHP를 사용하겠다.


방법은 "안드로이드(자바) <-> PHP <-> SQL" 이다.


1.일단 phpMyAdmin 을 이용해 mysql 에 테이블을 만든다.

(공모전때 서버 공부할 시간이 없기에... 간단히 en605.woobi.co.kr 의 웹서버와 MySQL을 쓰도록 하겠어.)

EminentStarui-MacBook-Pro:~ eminentstar$ ssh en605@en605.woobi.co.kr

en605@en605.woobi.co.kr's password: 

Last login: Wed Jul 15 13:03:02 2015 from 223.195.19.81

[en605@h6 ~]$ mysql en605.woobi.co.kr -u en605 -p

Enter password: 

ERROR 1044 (42000): 'en605'@'localhost' 사용자는 'en605.woobi.co.kr' 데이타베이스에 접근이 거부 되었습니다.

[en605@h6 ~]$ mysql -h en605.woobi.co.kr -u en605 -p

Enter password: 

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 187987533

Server version: 5.1.73-log Source distribution


Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.


Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.


Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> use en605

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A


Database changed

mysql> describe gcmtest911224

    -> ;

+-------+--------------+------+-----+---------+-------+

| Field | Type         | Null | Key | Default | Extra |

+-------+--------------+------+-----+---------+-------+

| id    | varchar(200) | YES  |     | NULL    |       |

+-------+--------------+------+-----+---------+-------+

1 row in set (0.00 sec)


mysql> 


2. php를 작성해 web server에 올린다. (경로는 /home/1/en60566/www)

-rw-r--r--  1 en605 user   1504 2015-07-15 05:41 gcmtest.php

<?

        define("HOST", "en605.woobi.co.kr");

        define("USER","en605");

        define("PASSWD","1230");

        define("DB_NAME","en605");



    // the string connection to  database. (location of Database, username, password)

    $connect=mysql_connect(HOST, USER, PASSWD) or

        die( "Fail to connect to SQL Server");



    mysql_query("SET NAMES UTF8");

   // choose a database

   mysql_select_db(DB_NAME, $connect);


   // Start Session

   session_start();


   //  Create a query sentence.

   $sql = "select * from  gcmtest911224";


   // store the query execution result into the variable $result.

   $result = mysql_query($sql, $connect);


   //Save the the number of the records returned.

   $total_record = mysql_num_rows($result);


   // In order to make the JSONArray format.....

   echo "{\"status\":\"OK\",\"num_results\":\"$total_record\",\"results\":[";


   //Make the format of JSONArray from each record returned.

   for ($i=0; $i < $total_record; $i++)

   {


      //move the pointer which will bring the record

      mysql_data_seek($result, $i);


      $row = mysql_fetch_array($result);

      echo "{\"id\":\"$row[id]\"}";


     // 留~H吏~@留~I ~H肄~T“~\ 댁„—~T ,瑜 遺~Y몃~K. 洹몃~^~X• 곗~

]댄~D 援щ„ ~X‹~H源~P.  

     /*

        Put .(comma) just before the last record. That's because you can distinguish data. 

     */

      if($i<$total_record-1){

        echo ",";

     }


   }

   // JSONArray~X 留~H吏~@留~I ‹リ린

   echo "]}";

?>

                                                              53,1         바닥


3.안드로이드 어플리케이션에서 웹서버의 php를 불러온다.

안드로이드 상에서 이 PHP파일을 읽으면 되는데 PHP파일 역시 웹상에 있기 때문에 웹에 접속하는 코드를 사용해야 합니다. 즉, 메인 쓰레드에서 실행시키면 실행이 안 된다는 것이지요. 아무튼 또 귀찮게 asynctask를 사용한다.

상범이형의 php 조언{

(나의 질문:웹서버에 php파일을 올리는 그런 개념이 어려워)

접근할때 예를 들어 en605.woobi.co.kr/main.php 이런식으로 접근하면 

웹으로 접근했을땐 화면이 출력되고 

안드로이드에서 데이터가 바로 받아져. 구체적으로 HTTP 프로토콜 통신써야하는데 기본적으로 저 URL 경로로 뭐 id나 pw같은 데이터를 보내면 저 URL이 연결되어있는 DB를 통해서 데이터를 보내주는거 엉엉 노박같은 경우에는 asp로 구축하면 되는데 비슷할꺼야 아마 ㅋㅋ

엉엉 APM 아마 구축해야될꺼야. 노박에서는 구축되어있나 모르겠는데 

접근하는 법만 알아도 금방해서 ㅋㅋ 대표적으로 APM아니면 톰캣 둘중에 하나 쓰는게 나을듯

톰캣은 JSP로 하면되고 APM은 아파치로 개발

}

한신이형 say: (앱개발시 http통신 사이트: 안드로이드로 앱개발시 http통신으로 웹서버하고 데이터 주고받을때 OkHttp검색해서 쓰세용.)

package com.example.gcmnovaktest;

import android.content.Intent;
import android.graphics.Bitmap;
import android.os.AsyncTask;
import android.os.Handler;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gcm.server.Message;
import com.google.android.gcm.server.MulticastResult;
import com.google.android.gcm.server.Sender;
import com.google.android.gms.gcm.GoogleCloudMessaging;

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

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Random;


public class MainActivity extends ActionBarActivity {

ImageView imView;
TextView txtView;

phpDown task; //웹서버의 php를 실행하기 위한 인스턴스

    ArrayList<ListItem> listitem = new ArrayList<ListItem>();
    ListItem Item;

//ListItem객체는 JSON형식으로 데이터를 셋팅하기 위한 클래스
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
task = new phpDown();
txtView = (TextView)findViewById(R.id.txtView);

task.execute("http://en605.woobi.co.kr/gcmtest.php");//도메인을 실행하게되면 php가 실행되서 데이터전달이 일어난다.


}

private class phpDown extends AsyncTask<String, Integer,String>{

@Override
protected String doInBackground(String... urls) {
StringBuilder jsonHtml = new StringBuilder();
try{
// 연결 url 설정
URL url = new URL(urls[0]);
// 커넥션 객체 생성
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(), "UTF-8"));
for(;;){
// 웹상에 보여지는 텍스트를 라인단위로 읽어 저장.
String line = br.readLine();
if(line == null) break;
// 저장된 텍스트 라인을 jsonHtml에 붙여넣음
jsonHtml.append(line + "\n");
}
br.close();
}
conn.disconnect();
}
} catch(Exception ex){
ex.printStackTrace();
}
return jsonHtml.toString();

}

/*
protected void onPostExecute(String str){
txtView.setText(str);
}
*/

protected void onPostExecute(String str){
String id;

try{
JSONObject root = new JSONObject(str);
JSONArray ja = root.getJSONArray("results"); //get the JSONArray which I made in the php file. the name of JSONArray is "results"

for(int i=0;i<ja.length();i++){
JSONObject jo = ja.getJSONObject(i);
id = jo.getString("id");
listitem.add(new ListItem(id));
}
}catch (JSONException e){
e.printStackTrace();
}
txtView.setText("id : "+listitem.get(0).getData(0));
}

}

}

package com.example.gcmnovaktest;

/**
* Created by eminentstar on 2015. 7. 15..
*/
public class ListItem {

private String[] mData;
final int columnCnt = 1;

public ListItem(String[] data){
mData = data;
}

public ListItem(String id){
mData = new String[columnCnt];
mData[0] = id;
}


public String[] getmData(){
return mData;
}

public String getData(int index){
return mData[index];
}
public void setData(String[] data){
mData = data;
}
}









댓글
  • 프로필사진 와이번스 질문이있습니다. 만일 phpdown 메소드를 별도의 클래스로 선언한뒤,
    phpdown에서 생성된 listItem을 메인 액티비티에서 확인하고 싶습니다.
    그럴땐 어떻게해야하나요??
    또한 for루프가 있고 그안에서 URL이 매번 바뀐다고 가정하면 그때의 execute는 어떻게 보내야하는지, 또 그렇게 생성된 listitem은 메인액티비티에서 어떻게 접근해야하나요?
    메인 액티비티안의 for루프안에서 URL이 매번바뀌고 그 URL을 가지고 execute를 하려하는데 doInground()후 onPostExecute가 되기도 전에 메인액티비티에서 다음줄로 넘어가버려 listitem을 확인하지 못하고있습니다 ㅠ
    2015.10.14 02:30 신고
  • 프로필사진 비밀댓글입니다 2016.02.20 13:53
  • 프로필사진 ys 저러면 출력이 테이블에 있는 모든 튜플이 다 나오나요??? asyntask는 한번도 안써봤는데 어찌 해야할지 난감하네요ㅠㅠㅠㅠ 그냥 자동으로 어플이 종료되는데 왜그러는지 모르겟어요ㅠㅠㅠㅠ 2016.05.03 16:00 신고
  • 프로필사진 ys 저러면 출력이 테이블에 있는 모든 튜플이 다 나오나요??? asyntask는 한번도 안써봤는데 어찌 해야할지 난감하네요ㅠㅠㅠㅠ 그냥 자동으로 어플이 종료되는데 왜그러는지 모르겟어요ㅠㅠㅠㅠ 2016.05.03 16:00 신고
  • 프로필사진 DevES 저같은 경우는 서버단에서
    echo "{\"id\":\"$row[id]\"}";
    와 같이 id칼럼만 가져오고 문자열을 추가적으로 형성해서
    안드로이드단에서
    String line = br.readLine();
    로 라인을 읽어왔습니다.!
    2016.05.03 21:35 신고
  • 프로필사진 LeeJongHyeon 안녕하세요? 예제 잘 봤습니다. phpDown의 doInBackground에서 try부분이 실행이 안되는데 왜그러죠? ㅠ 2016.05.10 18:05 신고
  • 프로필사진 DevES 음, try부분을 수행안한다는것은 에러가 나서 catch로 넘어간다는 말이신가요?? 2016.05.14 16:03 신고
  • 프로필사진 사람이 탈 버스가 아닙니다. 좋은 예제 정말 감사합니다. ListItem Class 를 따로 만든 이유가 뭔가요 ? 대충 어떤건지 알고있지만 좀 명쾌한 설명을 들어보고싶습니다. 감사합니다 2016.09.22 13:14 신고
댓글쓰기 폼
공지사항
Total
67,088
Today
35
Yesterday
129
TAG more
«   2018/06   »
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함