본문 바로가기

Android/Seoul OpenAPI 04

Android Seoul OpenAPI example

안드로이드에서 서울시 OpenAPI를 사용하여 가져온 데이터를 데이터베이스에 저장하고 ListView에도 출력하는 예

res/layout/main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_weight="1" > </ListView> </LinearLayout>

AndroidManifest.xml 파일 설정 <uses-permission android:name="android.permission.INTERNET"/>

res/layout/listview_row.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="TextView" /> <TextView android:id="@+id/textView2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="TextView" /> </LinearLayout>


MainActivity.java

package com.example.androidapp; import java.io.*; import java.net.*; import java.util.*; import org.apache.http.HttpResponse; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.DefaultHttpClient; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; import android.app.*; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.os.*; import android.util.*; import android.widget.*; public class MainActivity extends Activity { String auth_code = "개발자 인증 코드"; ListView listView; Handler handler = new Handler(); ArrayList<HashMap<String,String>> list; HashMap<String,String>map; DatabaseHelper dbHelper; SQLiteDatabase db; SimpleCursorAdapter cursorAdapter; Cursor cursor; String[] from; int[] to;

@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); list = new ArrayList<HashMap<String,String>>(); setContentView(R.layout.main); listView = (ListView) findViewById(R.id.listView1); new Thread() { public void run() { dbHelper = new DatabaseHelper(MainActivity.this, "SeoulPublic.db", null, 1); dbHelper.setSrcData(getPublicData()); db = dbHelper.getReadableDatabase(); cursor = db.rawQuery("select _id, ctf_name, ctf_tel from SeoulSafeFoods", null); from = new String[]{"ctf_name", "ctf_tel" }; to = new int[]{ R.id.textView1, R.id.textView2 }; handler.post(new Runnable(){ public void run() { // 뷰의 갱신과 관련한 코드는 메인 쓰레드에서만 접근할 수 있다 cursorAdapter = new SimpleCursorAdapter(MainActivity.this, R.layout.listview_row, cursor, from, to); listView.setAdapter(cursorAdapter); } }); } }.start(); } StringBuilder strBuilder = new StringBuilder(); String typeName, ctfName, ctfAddr, ctfTel; private ArrayList<HashMap<String,String>> getPublicData() { try{ String service = URLEncoder.encode("서울안심먹거리 목록", "UTF-8"); String strUrl = "http://openapi.seoul.go.kr:8088/xml/"+auth_code+"/"+service+"/1/50/"; HttpClient httpClient = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(strUrl); HttpResponse response = httpClient.execute(httpGet); InputStream is = response.getEntity().getContent(); XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); factory.setNamespaceAware(true); XmlPullParser xpp = factory.newPullParser(); xpp.setInput(is, "utf-8"); while(xpp.getEventType()!=XmlPullParser.END_DOCUMENT){ if(xpp.getEventType()==XmlPullParser.START_TAG){ if(xpp.getName().equals("CTF_TYPE_NAME")){ xpp.next(); // 텍스트로 이동 typeName = xpp.getText(); // 텍스트 가져옴 while(true) { xpp.next(); if(xpp.getEventType()==XmlPullParser.START_TAG && xpp.getName().equals("CTF_NAME")){ xpp.next(); ctfName = xpp.getText(); break; } } while(true) { xpp.next(); if(xpp.getEventType()==XmlPullParser.START_TAG && xpp.getName().equals("CTF_ADDR")){ xpp.next(); ctfAddr = xpp.getText(); break; } } while(true) { xpp.next(); if(xpp.getEventType()==XmlPullParser.START_TAG && xpp.getName().equals("CTF_TEL")){ xpp.next(); ctfTel = xpp.getText()==null || xpp.getText().equals("") ? "" : xpp.getText(); break; } } map = new HashMap<String,String>(); map.put("CTF_TYPE_NAME", typeName); map.put("CTF_NAME", ctfName); map.put("CTF_ADDR", ctfAddr); map.put("CTF_TEL", ctfTel); list.add(map); } // end of if(STF_TYPE_NAME) } // end of if( START_TAG) xpp.next(); } // end of while() return list; }catch(Exception ex) { ex.printStackTrace(); Log.e("접속오류", ex.toString()); } return null; } }


DatabaseHelper.java

package com.example.androidapp; import java.util.*; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class DatabaseHelper extends SQLiteOpenHelper { private final String TABLE_NAME = "SeoulSafeFoods"; private ArrayList<HashMap<String,String>> list; public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase db) {

Log.i("데이터베이스 생성", "데이터베이스가 생성되었습니다");

String sql = "drop table if exists "+TABLE_NAME; db.execSQL(sql); sql = "create table "+TABLE_NAME + " ( _id integer PRIMARY KEY autoincrement, " + "ctf_type_name text, " + "ctf_name text, " + "ctf_addr text, " + "ctf_tel text )"; db.execSQL(sql); Log.d("테이블 생성", "테이블 생성에 성공했습니다"); sql = "insert into "+TABLE_NAME +" ( " + "ctf_type_name, ctf_name, ctf_addr, ctf_tel " + " )" + "values ( ?, ?, ?, ? )"; String[] bindArgs = null; for(int i=0;i<list.size();i++) { bindArgs = new String[] { list.get(i).get("CTF_TYPE_NAME"), list.get(i).get("CTF_NAME"), list.get(i).get("CTF_ADDR"), list.get(i).get("CTF_TEL") }; db.execSQL(sql, bindArgs); } Log.d("데이터입력 성공", "먹거리 정보 저장 성공"); } @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); Log.d("데이터베이스 열기", "성공"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if(newVersion > 1) { db.execSQL("drop table if exists "+TABLE_NAME); onCreate(db); } } public void setSrcData(ArrayList<HashMap<String,String>> list) { this.list = list; } }