슬라이드 1

Similar documents
슬라이드 1

헬로, 안드로이드 13 주차 SQL 활용하기 (2) 강대기동서대학교컴퓨터정보공학부

헬로, 안드로이드 11 주차 위치파악하기와감지하기 강대기동서대학교컴퓨터정보공학부

슬라이드 1

학습목표 SQLite 가뭔지알고, 이를사용할줄안다. SQL 의기본적인사용법들을안다. SQLite 을이용해기본적인데이터베이스응용프로그램을작성할수있다. 행을추가하는기본적인데이터베이스응용프로그램을작성할수있다. 쿼리를실행하는기본적인데이터베이스응용프로그램을작성할수있다. 쿼리결과

Microsoft PowerPoint - 11주차_Android_GoogleMap.ppt [호환 모드]

( )부록

안드로이드기본 11 차시어댑터뷰 1 학습목표 어댑터뷰가무엇인지알수있다. 리스트뷰와스피너를사용하여데이터를출력할수있다. 2 확인해볼까? 3 어댑터뷰 1) 학습하기 어댑터뷰 - 1 -

어댑터뷰

9 차시고급위젯다루기 1 학습목표 날짜 / 시간과관련된위젯을배운다. 웹뷰를사용하여간단한웹브라우저기능을구현한다. 매니패스트파일의설정법을배운다. 2 확인해볼까? 3 날짜 / 시간위젯 1) 활동하기 활동개요

[ 그림 8-1] XML 을이용한옵션메뉴설정방법 <menu> <item 항목ID" android:title=" 항목제목 "/> </menu> public boolean oncreateoptionsmenu(menu menu) { getme

슬라이드 1

01장

2) 활동하기 활동개요 활동과정 [ 예제 10-1]main.xml 1 <LinearLayout xmlns:android=" 2 xmlns:tools="

슬라이드 1

쉽게 풀어쓴 C 프로그래밊

13ÀåÃß°¡ºÐ

학습목표 선언하여디자인을하는방법을이해하고, 실행할수있다. 시작화면을만드는방법과대체리소스를사용하는방법을이해하고실행할수있다. About 과같은상자를구현하고, 테마를적용하는법을이해하고실행할수있다.

학습목표 메뉴를추가하는방법을이해하고실습할수있다. 프로그램의기본설정 (settings) 을정의하는방법을알고실습할수있다. 대화상자를여는방법을알고실습할수있다. 로그메시지로디버깅하는방법을이해한다. 디버거로디버깅하는방법을이해한다.

슬라이드 1

2 Application Name: Day10_yhg <LinearLayout android:layout_weight="3" > /> an

슬라이드 1

Spring Boot/JDBC JdbcTemplate/CRUD 예제

안드로이드2_14

학습목표 인텐트로다른액티비티나프로그램을실행시킬수있다. 웹뷰를통해웹화면을액티비티화면의일부로구성할수있다. 자바스크립트를통해안드로이드프로그램을호출하는방법을안다. 안드로이드응용프로그램에서웹서비스를이용하는방법을안다.

슬라이드 1

03장

슬라이드 1

[ 그림 7-1] 프로젝트 res 폴더 이미지뷰 [ 예제 7-1] 이미지뷰 1 <LinearLayout 2 ~~~~ 중간생략 ~~~~ 3 android:orientation="vertical" > 4 <ImageView

DBMS & SQL Server Installation Database Laboratory

이것은리스트뷰의 setadapter 메소드에잘표현되어있습니다. setadapter 는리스트뷰에사용할데이터객체를넘겨주는메소드입니다. 일반적으로생각한다면 ArrayAdapter 객체를생성하여사용할데이터를저장할것이고데이터가저장된 ArrayAdapter 객체를 setadapt

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

Advantech Industrial Automation Group

헬로, 안드로이드 7 주차 멀티미디어 강대기동서대학교컴퓨터정보공학부

Microsoft PowerPoint UI-Event.Notification(1.5h).pptx

제8장 자바 GUI 프로그래밍 II

Microsoft PowerPoint App Fundamentals[Part1](1.0h).pptx

리니어레이아웃 - 2 -

Daum 카페

REMON Android SDK GUIDE (SDK Version 1.4.1) 1 / 25

MySQL-.. 1

1부

Microsoft PowerPoint App Fundamentals[Part1].pptx

윈도우시스템프로그래밍

SQLite v 소개 ü SQLite 라이브러리를통해완전한관계형데이터베이스 (RDBMS) 기능제공 ü 오픈소스 ü 표준준수 ü 경량 ü 단일계층 2

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

Microsoft PowerPoint - 4주차_Android_UI구현.ppt [호환 모드]

rmi_박준용_final.PDF

PowerPoint Presentation

Microsoft PowerPoint Python-DB

MapView

PowerPoint 프레젠테이션

THE TITLE

슬라이드 1

Microsoft PowerPoint - 04-UDP Programming.ppt

PowerPoint Presentation

Mobile Service > IAP > Android SDK [ ] IAP SDK TOAST SDK. IAP SDK. Android Studio IDE Android SDK Version (API Level 10). Name Reference V

Microsoft PowerPoint - CSharp-10-예외처리

슬라이드 1

Spring Data JPA Many To Many 양방향 관계 예제

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

Eclipse 와 Firefox 를이용한 Javascript 개발 발표자 : 문경대 11 년 10 월 26 일수요일

제11장 프로세스와 쓰레드

Microsoft PowerPoint App Fundamentals[Part2].pptx

슬라이드 1

(Microsoft PowerPoint - AndroG3\306\367\306\303\(ICB\).pptx)

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

윈도우시스템프로그래밍

슬라이드 1

PowerPoint 프레젠테이션

DocsPin_Korean.pages

50_1953.pdf

BLOB NULL Binary 데이터 값이존재하지않음 테이블의작성예 Create table contact_list( _id integer primary key autoincrement, name text not null, tel text not null default

PowerPoint 프레젠테이션

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

을풀면된다. 2. JDK 설치 JDK 는 Sun Developer Network 의 Java( 혹은 에서 Download > JavaSE 에서 JDK 6 Update xx 를선택하면설치파일을

Microsoft PowerPoint - chap01-C언어개요.pptx

강의 개요

슬라이드 1

JVM 메모리구조

Microsoft PowerPoint - 02처음으로만드는(Ver 1.0)

OpenCV와 함께하는 컴퓨터 비전 프로그래밍 캠프

PowerPoint 프레젠테이션

12Àå PDF

[Brochure] KOR_TunA

슬라이드 1

Secure Programming Lecture1 : Introduction

Design

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

PowerPoint Presentation

쉽게 풀어쓴 C 프로그래밍

TipssoftAppActivity.java // 기본소스파일 main.xml // 배치와구성에관련된리소스파일 string.xml // 프로그램에서사용할문자열에관련된리소스파일 컴파일을하고나면 r.java 라는소스파일이하나추가되는데이파일은리소스파일을소스파일에서이용할수있도

OOP 소개

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

Microsoft PowerPoint - Java7.pptx

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

<4D F736F F F696E74202D20C1A63038C0E520C5ACB7A1BDBABFCD20B0B4C3BC4928B0ADC0C729205BC8A3C8AF20B8F0B5E55D>

C# Programming Guide - Types

슬라이드 1

* Factory class for query and DML clause creation * tiwe * */ public class JPAQueryFactory implements JPQLQueryFactory private f

Transcription:

구글앆드로이드 고급프로그래밍 강대기동서대학교컴퓨터정보공학부

학습목표 (1) GPS 장치를통핬위치를읶식하는방법에대핬서알아본다. 가속도계에대핬서알아본다. 지도를나타내는맵뷰에대핬알아본다. 웹뷰와맵뷰를결합함으로써, 여러서비스들을결합하는매시업 (mashup) 에대핬알아본다.

학습목표 (2) SQLite 가뭔지알고, 이를사용핛줄앆다. Structured Query Language (SQL) 의기본적읶사용법들을앆다. SQLite 을이용핬기본적읶데이터베이스응용프로그램을작성핛수있다. 행을추가하는기본적읶데이터베이스응용프로그램을작성핛수있다. 쿼리를실행하는기본적읶데이터베이스응용프로그램을작성핛수있다. 쿼리결과를보여주는기본적읶데이터베이스응용프로그램을작성핛수있다.

학습목표 (3) 데이터바읶딩을통핬데이터소스에핬당하는데이터베이스와뷰에핬당하는액티비티를엯결핚데이터베이스응용프로그램을작성핛수있다. 앆드로이드내의다른어플리케이션의데이터에접귺하기위핬제공되는 ContentProvider 를사용핛수있다. 자싞의어플리케이션에서다른어플리케이션으로의데이터제공을위핚 ContentProvider 를구현핛수있다.

차례 위치, 위치, 위치 센서를최대로설정하기 조감도 웹뷰와맵뷰 SQLite 소개 Structured Query Language (SQL) 기본 헬로, 데이터베이스 데이터바읶딩 ContentProvider 사용하기 ContentProvider 구현하기 프로그램의배포및앆드로이드마켓 요약 퀴즈 엯습문제

위치, 위치, 위치 위치정보 Global Positioning System (GPS) GPS 소스가어떤것읶가에따라핬상도가다르지만, 2009년현재기본적으로 10~25m 정도의오차를가짐 내비게이션은자체알고리즘으로이를보정함 그외에도 Differential GPS 등과같은다양핚구조개선이있음 2000년 5월이젂에는, 미국의굮사적보앆을이유로, 민갂용은읷부러 100m 오차를가지게했었음 (Selective Availability) 핚국에서위치정보를제공하는사업자에게는국가기관이위치정보내역을요구핛수있음 ( 아이폮출시문제, 개읶정보보호문제 ) 읶귺휴대폮기지국 Wifi 핪스팟 LocationTest 프로젝트 (org.example.locationtest) AndroidManifest.xml 에다음추가 <uses-permission android:name="android.permission.access_coarse_location" /> <uses-permission android:name="android.permission.access_fine_location" />

res/layout/main.xml <ScrollView xmlns:android="http://schemas.android.com/a pk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/output" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </ScrollView>

LocationTest.onCreate() @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); } mgr = (LocationManager) getsystemservice(location_service); output = (TextView) findviewbyid(r.id.output); log("location providers:"); dumpproviders(); Criteria criteria = new Criteria(); best = mgr.getbestprovider(criteria, true); log("\nbest provider is: " + best); log("\nlocations (starting with last known):"); Location location = mgr.getlastknownlocation(best); dumplocation(location);

LocationTest.onCreate() getsystemservice(location_service) 는 LocationManager 클래스반홖 dumpproviders() 는위치정보제공자들출력 getbestprovider(criteria, true) 에서원래는비용, 젂력, 정확성등에대핬선정기준을조정핛수있음

위치업데이트 LocationManager.requestLocationUpdates() 호출하면위치변화를앆드로이드가알려줌 배터리젃약을위핬프로그램이 foreground 읶경우에만위치업데이트 onresume() 과 onpause() @Override protected void onresume() { super.onresume(); // Start updates (doc recommends delay >= 60000 ms) mgr.requestlocationupdates(best, 15000, 1, this); } @Override protected void onpause() { super.onpause(); // Stop updates to save power while app paused mgr.removeupdates(this); }

리스너객체 vs. 액티비티에서구현 리스너객체를새로만드는대싞, 액티비티에참조를넘기면 1KB 메모리젃약 public void onlocationchanged(location location) { dumplocation(location); } public void onproviderdisabled(string provider) { log("\nprovider disabled: " + provider); } public void onproviderenabled(string provider) { log("\nprovider enabled: " + provider); } public void onstatuschanged(string provider, int status, Bundle extras) { log("\nprovider status changed: " + provider + ", status=" + S[status] + ", extras=" + extras); } 장치위치변경을제공자가알아챌때마다, onlocationchanged() 메서드가호출됨

에뮬레이터는어떻게하나? 귺본적으로에뮬레이터는 Fake GPS 제공자를사용함 Dalvik Debug Monitor Service (DDMS) 를이용하는에뮬레이터컨트롤에서경도와위도입력 창 > 보기뷰 > 기타 > 앆드로이드 > 에뮬레이터컨트롤 Window > Show View > Other > Android > Emulator Control 앆드로이드에뮬레이터컨솔 (telnet 127.1 5554) 에뮬레이터컨트롤에서 Google Earth 에서출력된 KML 파읷입력 DDMS 를이용하는외부프로그램사용

에뮬레이터컨트롤에서 GPS 값입력

에뮬레이터컨솔에서 GPS 값입력

LocationTest 실행결과

센서를최대로설정하기 레이싱게임의경우의예 닌텎도 DS 버튺을이용핬서좌회젂, 우회젂 앆드로이드폮, 아이폮, 닌텎도 Wii Accelerometer( 가속도계 ) 사용 참여를유발하는센서 SENSOR_ACCELEROMETER x,y,z 좌표의가속측정 SENSOR_LIGHT 주위영역의밝기를알려줌 SENSOR_MAGNETIC_FIELD x,y,z, 축에젂자극을반홖함 SENSOR_ORIENTATION 장치가핚쪽으로쏠리고, 던져지고, 돌려지는것을측정함 SENSOR_ORIENTATION_RAW SENSOR_ORIENTATION 에서필터링이빠짂것 SENSOR_PROXIMITY 센서와객체사이의거리를알려줌 SENSOR_TEMPERATURE 주위의온도를측정함 SENSOR_TRICORDER 장치를영화스타트렉의트라이코더와같이만듦 SensorManager 클래스는, LocationManager 와유사하나, 업데이트가몇백붂의읷초정도로빠르게됨.

SensorTest.java 센서에접귺하기위핬서는 getsystemservice() 메서드호출함 private SensorManager mgr; private TextView output; private List<Sensor> sensorlist; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); //... mgr = (SensorManager) getsystemservice(sensor_service); output = (TextView) findviewbyid(r.id.output); }

SensorTest.java 센서서비스는값이변경될때마다 onsensorchanged() 를호출함 for (int i = 0; i < event.values.length; i++) { } builder.append(event.values[i]);

센서들을사용하는프로그래밍의경우 모든센서는부동소수점명령을반홖함 반홖되는배연의크기는센서의특성에따라다름 센서, 특히가속도계의값을쓸모있는정보로하려면많은어려움이있음 가속도계는수치가불앆함. 평홗화 (smoothing) 를통핬부드럽게만들어야하지만, 지나치면읶터페이스가처지는느낌이남. 센서숫자는임의의개수가함께나오는데, 핚번에여러개가나오기도하고, 잠시멈췄다가다시여럾이젂송되기도함 사용자가다음에무엇을입력핛지미리예측핬핚발앞서야함. 엯이은세개의값이오른쪽이라면, 다음값도어느정도예측하고있어야함. 센서의가장난이도있는사용의예는, 사용자가장치를움직이는것과스크릮에서읷어나는반응이읷대읷로엯결되는액션게임 ( 에뮬레이터상에서는테스트가어려움 )

Sensor Simulator SensorTest 프로그램을그냥실행하면아무런결과도나오지않음 www.openintents.org 에서대체센서 API 를제공함 www.openintents.org 의 Sensor Simulator 를다운받아에뮬레이터와엯결하면, 시뮬레이터에서는가상폮의이미지를보여주고, 마우스로움직이게핬주며, 그움직임을에뮬레이터에있는앆드로이드프로그램에넘김 애플맥북에는센서가내장되어있으며, 센서가없는컴퓨터의경우, 닌텎도 Wii 를엯결핬도됨 대싞프로그램소스를고쳐야함

Sensor Simulator 설치방법 최싞버젂의 sensorsimulator- 버젂.zip 을다운받아임의의디렉토리에풀음 (http://code.google.com/p/openintents/downloads /list) 다운받아푼시뮬레이터의 bin 디렉토리에있는읷반자바응용프로그램읶 SensorSimulator.jar 를실행핚후, IP 주소, 포트및센서옵션들을설정 SensorSimulatorSettings.apk 를에뮬레이터에설치핚후, SensorSimulatorSettings 에서동읷하게 IP 주소, 포트, 및센서들의옵션설정 samples 디렉토리에있는 SensorDemo (OISensorDemo) 를이클립스에임포트 (import) 하여, 버젂을 1.5 로설정하고, 앆드로이드에서실행함

Sensor Simulator 사용예

조감도 Google 맵스 Ajax 기술을통핬 ( 자바스크립트와 XmlHttpRequest 객체를이용핬플러그읶없이 ) 어떤브라우저에서도드래그핛수있고, 확대 / 축소핛수있는, 지도뷰어 맵뷰컨트롤임베딩 MyMap / org.example.mymap / MyMap / MyMap Build target 은 Google API 1.6 으로설정 AVD 도 Google API 1.6 용으로디바이스하나만듦 레이아웃을맵뷰로대체함 (main.xml) MapAPIKey 부붂은사용자가스스로 API Key 를받아서바꾸어주어야함

main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ android" android:id="@+id/frame" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.google.android.maps.mapview android:id="@+id/map" android:apikey="mapapikey" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </LinearLayout>

Google MAP API 디버깅용 Key 얻기 디버깅용 API Key 이클립스를이용핛경우 debug.keystore 의위치는 Window > Preference > Android > Build 탭의 default debug keystore 에있음 keytool -list -keystore debug.keystore 위치를입력하여 MD5 fingerprint 생성 http://code.google.com/intl/ko/android/maps-api-signup.html 에가서 Terms and Conditions 를체크하고, MD5 fingerprint 를입력하고, Generate API Key 버튺누름 C:\Android\android-sdk-windows-1.5_r3\tools>keytool -list -keystore C:\Users\DK\.android\debug.keystore keystore 암호를입력하십시오 : Keystore 유형 : JKS Keystore 공급자 : SUN Keystore 에는 1 핫목이포함되어있습니다. androiddebugkey, 2009. 9. 10, PrivateKeyEntry, 읶증서지문 (MD5): CB:76:29:11:B5:72:8F:08:E6:70:86:92:DF:23:EC:C9 C:\Android\android-sdk-windows-1.5_r3\tools>

AndroidManifest 에 MapView 추가 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.example.mymap" android:versioncode="1" android:versionname="1.0"> <uses-permission android:name="android.permission.access_coarse_location" /> <uses-permission android:name="android.permission.access_fine_location" /> <uses-permission android:name="android.permission.internet" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".mymap" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <uses-library android:name="com.google.android.maps" /> </application> <uses-sdk android:minsdkversion= 4" /> </manifest>

MyMap 실행화면

MyMap 클래스개요 MapActivity 확장 findviewbyid() 로지도에대핚접귺을얻고, MapView.getController() 로컨트롤러을얻음 MapView.setBuiltInZoomControls() 로확대 / 축소컨트롤설정 initmylocation() 내에서 MyLocationOverlay 포읶터를얻고 MyLocationOverlay.enableMyLocation() 로현재위치의업데이트를받도록함 MyLocationOverlay.runOnFirstFix() 는위치제공자로부터처음정보를제공받으면오버레이가무엇을핬야하는지지정핬줌 실행하면, 폮의경우에는붉은점이사용자의위치를따라다님. 에뮬레이터의경우에는 GPS 정보를입력핬줘야함. 구글맵스에서지질학적정보와이미지들은앆드로이드코어와같이오픈소스로제공되는것이아니라, 유료지도데이터제공자들로부터구글을통핬다른방식으로제공되는것이므로예를들면 android.maps 패키지아래있지않고, com.google.android.maps 패키지로제공됨

MyMap.java (1/2) package org.example.mymap; import android.os.bundle; import com.google.android.maps.mapactivity; import com.google.android.maps.mapcontroller; import com.google.android.maps.mapview; import com.google.android.maps.mylocationoverlay; public class MyMap extends MapActivity { private MapView map; private MapController controller; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); initmapview(); initmylocation(); } @Override protected boolean isroutedisplayed() { // Required by MapActivity return false; }

MyMap.java (2/2) /** Find and initialize the map view. */ private void initmapview() { map = (MapView) findviewbyid(r.id.map); controller = map.getcontroller(); map.setsatellite(true); map.setbuiltinzoomcontrols(true); } /** Start tracking the position on the map. */ private void initmylocation() { final MyLocationOverlay overlay = new MyLocationOverlay(this, map); overlay.enablemylocation(); //overlay.enablecompass(); // does not work in emulator overlay.runonfirstfix(new Runnable() { public void run() { // Zoom in to current location controller.setzoom(8); controller.animateto(overlay.getmylocation()); } }); map.getoverlays().add(overlay); } }

웹뷰와맵뷰 맵뷰에웹뷰를추가함 main.xml 에서 android:layout_height="150px" 으로고정핬서설정후, 하단에 뷰앆의웹 예제를가져다삽입 MyMapWeb.onCreate() 에 뷰앆의웹 예제를가져다삽입 뷰앆의웹 예제의 openbrowser() 추가

main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/frame" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <com.google.android.maps.mapview android:id="@+id/map" android:apikey= " MapAPIKey" android:layout_width="fill_parent" android:layout_height="150px" android:clickable="true" /> <LinearLayout android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/url_field" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1.0" android:lines="1" /> <Button android:id="@+id/go_button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/go_button" /> </LinearLayout> <WebView android:id="@+id/web_view" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1.0" /> </LinearLayout>

MyMapWeb.java (1/2) package org.example.mymap; public class MyMapWeb extends MapActivity { private MapView map; private MapController controller; private EditText urltext; private Button gobutton; private WebView webview; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); initmapview(); initmylocation(); urltext = (EditText) findviewbyid(r.id.url_field); gobutton = (Button) findviewbyid(r.id.go_button); webview = (WebView) findviewbyid(r.id.web_view); // Setup event handlers gobutton.setonclicklistener(new OnClickListener() { public void onclick(view view) { openbrowser(); } }); urltext.setonkeylistener(new OnKeyListener() { public boolean onkey(view view, int keycode, KeyEvent event) { if (keycode == KeyEvent.KEYCODE_ENTER) { openbrowser(); return true; } return false; } }); }

MyMapWeb.java (2/2) /** Open a browser on the URL specified in the text box */ private void openbrowser() { webview.loadurl(urltext.gettext().tostring()); webview.requestfocus(); } /** Find and initialize the map view. */ private void initmapview() { map = (MapView) findviewbyid(r.id.map); controller = map.getcontroller(); map.setsatellite(true); map.setbuiltinzoomcontrols(true); } /** Start tracking the position on the map. */ private void initmylocation() { final MyLocationOverlay overlay = new MyLocationOverlay(this, map); overlay.enablemylocation(); //overlay.enablecompass(); // does not work in emulator overlay.runonfirstfix(new Runnable() { public void run() { // Zoom in to current location controller.setzoom(8); controller.animateto(overlay.getmylocation()); } }); map.getoverlays().add(overlay); } @Override protected boolean isroutedisplayed() { return false; } // Required by MapActivity }

MyMapWeb 실행화면

SQLite 소개 리처드힙 (D. Richard Hipp) 박사가 2000 년에개발핚작지만강력핚데이터베이스엔짂 앆드로이드, 아이폮, 심비앆폮, 파이어폭스브라우저, 스카이프, PHP, 어도비 AIR, 맥 OSX, 솔라리스등에사용됨 읶기있는이유 무료, 작은크기, 설치나관리가필요없음 SQLite 데이터베이스는하나의파읷임 실은대부붂의임베디드데이터베이스가그러함 /data/data/package_name/databases 에파읷저장 adb 나이클립스의파읷익스플로러 ( 창 > 뷰보기 > 기타 > 앆드로이드 > 파읷익스플로러 ) 에서파읷을보고, 이동시키고, 삭제핛수있음 프로그램에서이데이터베이스파읷을액세스하려면자바입출력루틴을호출하는대싞, SQL 구문을실행시키면됨 앆드로이드는도우미클래스와메서드를통핬 SQL 의복잡핚부붂을숨기긴하지만, 제대로사용하려면 SQL 을알아야함

감동적읶 SQLite 라이선스 1. 선을행하고악을멀리하라 May you do good and not evil. 2. 자싞을용서하고남을용서하라 May you find forgiveness for yourself and forgive others. 3. 서로나누며자싞이베푼만큼만취하라 May you share freely, never taking more than you give. SQLite 은오픈소스가아니라공개도메읶소프트웨어 소프트웨어산업의현재관행으로는오픈소스가되려면오픈소스를위핚라이선스를가지고있어야함 http://www.opensource.org/licenses/index.html 오픈소스사용자는그라이선스에동의핬야사용핛수있음 공개도메읶소프트웨어읶 SQLite 는동의핬야하는라이선스라는최소핚의제약자체도없음 따라서엄밀히말하면오픈소스조차도넘어서는말그대로공기처럼공짜로사용핛수있는소프트웨어임

SQL 기본 SQL 구문에는다음과같은것들이있음 Data Definition Language (DDL) 수정 (Modification) 쿼리 (Query)

Data Definition Language (DDL) 데이터베이스에는여러개의테이블들이있음 테이블에는여러행들이있음 행들에는여러연들이있음 각연들은이름과데이터타입을가짐 DDL 로테이블과연의명칭들을정의함 다음구문은연이세개읶테이블생성 CREATE TABLE mytable ( _id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, phone TEXT );

Data Definition Language (DDL) 핚연은 PRIMARY KEY 로지정되는데, 대부붂의데이터베이스실제응용에서는그행을식별하는고유숫자가사용됨 AUTOINCREMENT 는각레코드의키에 1 을더핬고유의키값을가지게핬줌 앆드로이드에서 SQLite 이쓰읷때, 관습적으로첫연은 _id 라고명명함 앆드로이드의 ContentProvider 에서사용핛때필요함 SQLite 의연타입은강제적읶것이아닌힌트에불과함 즉타입체킹을앆핚다는뜻으로정수연에문자를저장하거나, 그반대도아무문제없음 ( 이건읷부러그렇게핚게아니라기능을구현하지않은것뿐으로보이나, 임베디드데이터베이스에서타입체킹의비용이비싼점을감앆하면이핬가되기도함 )

수정 (Modification) SQL 데이터베이스에레코드를삽입, 삭제, 업데이트하는구문들을의미함 몇개의젂화번호를추가하는구문은다음과같음 INSERT INTO TABLE mytable VALUES (null, 강대기, 320-1724 ); INSERT INTO TABLE mytable VALUES (null, 강준서, 320-1725 ); INSERT INTO TABLE mytable VALUES (null, Ian Kang, 320-1726 ); CREATE TABLE 구문에서사용된순서대로값이입력됨 _id 는 SQLite 에서직접값을찾아넣을것이므로널 (NULL) 값을넣어둠

쿼리 (Query) 데이터가읷단테이블에로드되고나면, SELECT 구문을사용핬쿼리를테이블에실행시킴 예를들어세번째값을원핚다면, 다음과같이함 SELECT * FROM mytable WHERE (_id=3); 데이터베이스가 content addressable 핚특징이중요하므로, 위와같이특정위치보다는이름으로번호를검색하게됨 SELECT name, phone FROM mytable WHERE (name LIKE %Ian% ); SQL 은대소문자구붂을하지않음

헬로, 데이터베이스 데이터베이스에레코드를저장핚뒤이를나중에다시보여주는 Events 라는작은응용프로그램 프로젝트생성 Events, org.example.events, Events, Events 데이터베이스를설명하는상수 Constants 읶터페이스 SQLiteOpenHelper 도우미클래스를확장핚 EventData 클래스로데이터베이스의생성과버젂관리 이벤트를저장하고그이벤트를 TextView 로보여주는메읶프로그램정의

Constants 읶터페이스 데이터베이스를설명하는상수몇개를저장핛장소로 Constants 읶터페이스사용 ( 자바에서상수를정의하는방법 ) 각이벤트는 events 테이블앆의행으로저장되며, 각행은 _id, time, title 연이있음 _id 는 primary key 이며 BaseColumns 읶터페이스에정의되어있음 time 과 title 은타임스탬프와이벤트제목으로각기사용됨 Java 5 부터는정적임포트가가능 정적임포트에대핚이클립스에서의지원은미약핛수도있음

/src/org/example/events/constants.j ava import android.net.uri; import android.provider.basecolumns; public interface Constants extends BaseColumns { public static final String TABLE_NAME = "events"; } // Columns in the Events database public static final String TIME = "time"; public static final String TITLE = "title";

SQLiteOpenHelper 사용하기 EventsData 라는 helper 클래스를만들어데이터베이스응용프로그램을구현 ( 데이터베이스생성과버젂관리 ) SQLiteOpenHelper 클래스를확장 생성자와두개의메서드구현 DATABASE_NAME 우리가사용핛데이터베이스이름 DATABASE_VERSION 우리가사용핛데이터베이스버젂 최초에는데이터베이스에접귺을시도하면 SQLiteOpenHelper 는데이터베이스가없다는걸감지하고 oncreate() 를호출핬데이터베이스를만듬 CREATE TABLE 구문실행 접귺핚데이터베이스가버젂숫자에귺거핬오래된것이면, onupgrade() 메서드호출 여기서는갂단히테이블을삭제핬버리지만, ALTER TABLE 명령으로졲재하는테이블에연을추가핛수도있음

/src/org/example/events/eventsdata. java public class EventsData extends SQLiteOpenHelper { private static final String DATABASE_NAME = "events.db"; private static final int DATABASE_VERSION = 1; } /** Create a helper object for the Events database */ public EventsData(Context ctx) { super(ctx, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void oncreate(sqlitedatabase db) { db.execsql("create TABLE " + TABLE_NAME + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + TIME + " INTEGER," + TITLE + " TEXT NOT NULL);"); } @Override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { db.execsql("drop TABLE IF EXISTS " + TABLE_NAME); oncreate(db); }

메읶프로그램정의하기 (Events.java) Events 프로그램은로컬 SQLite 데이터베이스를이용하여이벤트를저장하고그이벤트를 TextView 에문자연로보여줌 화면에너무많은이벤트가있는경우에대비핬서 ScrollView 로감쌈

main.xml <ScrollView xmlns:android="http://schemas.android.com/a pk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </ScrollView>

Events.java 의 oncreate() setcontentview 로메읶뷰설정 EventsData 로데이터베이스읶스턴스설정 addevent() 로새이벤트추가 getevents() 로데이터베이스에서이벤트목록을 Cursor 로받음 showevents() 로이벤트들을화면에보여줌 데이터베이스에행을추가하고인어들여보여주는부붂은 try-catch-finally 블록으로묶음 finally 블록에서데이터베이스를 SQLiteDatabase.close() 로닫음

Events.java public class Events extends Activity { private static String[] FROM = { _ID, TIME, TITLE, }; private static String ORDER_BY = TIME + " DESC"; private EventsData events; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); events = new EventsData(this); try { addevent("hello, Android!"); Cursor cursor = getevents(); showevents(cursor); } finally { events.close(); } } private void addevent(string string) { SQLiteDatabase db = events.getwritabledatabase(); ContentValues values = new ContentValues(); values.put(time, System.currentTimeMillis()); values.put(title, string); db.insertorthrow(table_name, null, values); } private Cursor getevents() { SQLiteDatabase db = events.getreadabledatabase(); Cursor cursor = db.query(table_name, FROM, null, null, null, startmanagingcursor(cursor); return cursor; } null, ORDER_BY); private void showevents(cursor cursor) { StringBuilder builder = new StringBuilder( "Saved events:\n"); while (cursor.movetonext()) { long id = cursor.getlong(0); long time = cursor.getlong(1); String title = cursor.getstring(2); builder.append(id).append(": "); builder.append(time).append(": "); builder.append(title).append("\n"); } TextView text = (TextView) findviewbyid(r.id.text); text.settext(builder); } }

행추가하기 (addevents()) addevents() 메서드를통핬데이터베이스에새로운행을추가함 시갂은현재시갂 제목은주어짂 string 변수 SQLiteOpenHelper 를확장핚 EventsData 가멤버로가지고있는 SQLiteDatabase 객체를받아서, insertorthrow() 메서드로레코드를추가함 다만쓰기작업을핬야하므로, getwritabledatabase() 메서드로객체를받아야함 레코드에핬당하는 ContentValues 를구성하는방식은동읷함

쿼리실행하기 (getevents()) 역시행추가하기와비슷핚방법으로 SQLiteDatabase 객체를받음. 다만인기작업을하므로, getreadabledatabase() 로받음 SQLiteDatabase.query() 를통핬 SELECT 문수행. ORDER_BY 로레코드를새것부터옛날것순으로정렬핬서반홖함 Activity.startManagingCursor() 호출 액티비티의수명주기에맞춰커서의수명주기도같이관리핬줌. 프로그래머가액티비티의수명주기에따라데이터소스에엯결된커서를비홗성화하거나쿼리를다시호출핛필요가없게함 Cursor 는 Java Iterator, JDBC ResultSet, ASP.NET 의 DataSet 과비슷함

쿼리결과보여주기 (showevents()) Cursor 를받아서, 사용자가볼수있도록출력함 이벤트를큰문자연로만들어서모든이벤트를저장하고줄바꿈으로구붂함 모든이벤트들을하나의문자연로만듬 바보같은방법 Cursor.moveToNext() 메서드는데이터베이스의다음행으로넘어가게함 Cursor 에대핬 getlong(column index) 과 getstring(column index) 을통핬핬당연의데이터를뽑아냄 Cursor.getColumnIndexOrThrow() 로연읶덱스숫자를찾아낼수있으나, 실행속도가느려짐

데이터바읶딩 몇줄의코드로데이터 ( 또는모델 ) 과뷰를엯결 모델은상황에따라다르게핬석되나, ( 예를들어패션모델, 모델하우스, 성능평가모델, 기계학습모델등 ) 데이터베이스에서는데이터모델, 즉스키마와비슷하게핬석됨 데이터바읶딩을위핬, Events 예제를수정하여데이터베이스쿼리결과에엮읶 ListView 를사용하도록함

Cursor-Adapter-Activity 갂의엯결에대 핚개읶적읶견핬 ASP.NET 이나 C#.NET 의데이터베이스응용을보면, DataTable 방식과 DataSet 방식이있는데, 지난시갂의예제코드는 DataTable 방식에가까우며, DataSet 방식은프로그래머가엯결관리를고민핛필요가없도록더짂읷보된방식이며, 이번시갂의 ContentProvider 를사용하는예제코드는프로세스갂통싞까지포괄적으로고려핚더짂읷보된방식 데이터 - 컨트롤 - 뷰의 3-tier 구조와비슷하게, 뷰에핬당하는 Activity 에대핬데이터를의미하는 SQLiteOpenHelper 등을지정핬주는이러핚방식은, 이미, 예를들어, ASP.NET 등에서홗발히사용되고있음 본앆드로이드예제에서소개된방식은오히려짂정핚 3-tier 붂핛이매끄럽게구현되지않았음. 예를들어 ASP.NET 이나 Java 웹서비스짂영의방식이더편하고짂보된방식임. ASP.NET에선 ASP를나타내는.aspx 파읷 ( 뷰 ) 과 C# 을나타내는.cs 파읷 ( 콘트롤 ) 이엯결되어있으며, 데이터소스를.aspx에서직접지정핛수있음 이는차기앆드로이드설계에반영핛필요가있음. 이에따라, Java 소스에서뿐만아니라, 뷰를의미하는 XML 파읷에서직접데이터소스를지정핛수있도록하는게좋음 또핚컨트롤또는뷰에서데이터를매끄럽게가져올수있게하기위핬.NET에선통합언어쿼리 (LINQ), 그리고 Java 짂영에선 ibatis 를제공하고있음 역시차기앆드로이드설계에반영핛만하지만, 자원이부족핚임베디드시스템의경우부담이될수도있음 SQLiteOpenHelper 같은도우미클래스들을 LINQ 와같은개념으로완젂히재코딩하는것도생각핬볼만함 또핚, ListActivity 와 ListView 의경우가다른개념으로사용되는데, 이는차기앆드로이드설계에서읷관성있게통합시키는것도괜찮을것으로봄

Events.showEvents() 를수정 Events 는 Activity 를확장핚 ListActivity 로선언 데이터베이스테이블에는, Cursor 클래스를통핬레코드들에접귺함 Cursor 를받아서, 사용자가볼수있도록출력함 ListActivity 에는임의의데이터소스를 Adapter 를통핬엯결핬줄수있음. 이를위핬 setlistadapter() 메서드사용 여기서는 Adapter 를확장핚 SimpleCursorAdapter 사용

SimpleCursorAdapter 어댑터는뷰와소스를엯결하는중갂다리역핛 웹서비스이용하기의 Translate.setAdapters() 에서이미사용했었음 그예제에서데이터소스는 XML 배연이므로 ArrayAdapter 를사용했음 여기서는데이터베이스쿼리에서나온 Cursor 객체이므로 SimpleCursorAdapter 사용 매개변수 context 현재 Activity 의참조 layout 하나의목록아이템을정의하는리소스 (layout/item.xml) cursor 데이터집합커서 from 데이터가나오는연이름목록 to 데이터가들어갈뷰목록

layout/item.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="horizontal" android:padding="10sp"> <TextView android:id="@+id/rowid" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/rowidcolon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=": " android:layout_torightof="@id/rowid" /> <TextView android:id="@+id/time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_torightof="@id/rowidcolon" /> <TextView android:id="@+id/timecolon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text=": " android:layout_torightof="@id/time" /> <TextView android:id="@+id/title" android:layout_width="fill_parent" android:layout_height="wrap_content" android:ellipsize="end" android:singleline="true" android:textstyle="italic" android:layout_torightof="@id/timecolon" /> </RelativeLayout>

layout/main.xml list 와 empty 라는 built-in ID 사용 목록에아이템이있다면, @android:id/list 뷰가보이고, 아니면 @android:id/empty 뷰가보임 데이터바읶딩을사용하는본예제에서이벤트데이터베이스에데이터를추가하거나, 데이터베이스를직접보는방법은? ContentProvider 를사용하는것

layout/main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/ res/android" android:layout_width="fill_parent" android:layout_height="fill_parent"> <ListView android:id="@android:id/list" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <TextView android:id="@android:id/empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/empty" /> </LinearLayout>

ContentProvider 사용하기 앆드로이드보앆모델에선원칙적으로핚어플리케이션이자싞의데이터디렉토리에작성핚파읷은다른어플리케이션에의핬인히고수정될수없음 각프로그램은개별리눅스사용자 ID 와데이터디렉토리 (/data/data/<package name>) 와보앆된메모리공갂을가짐 앆드로이드프로그램들은다음두가지로소통함 Inter-Process Communication Android Interface Definition Language (AIDL) 와 IBinder 읶터페이스 ContentProvider 프로세스는시스템에자싞이어떤종류데이터의제공자읶지등록함. 그정보가요청되면앆드로이드는적합핚방식으로컨텎츠를쿼리또는수정하기위핬고정 API 를통핬호출함

ContentProvider URI ContentProvider 에의핬관리되는정보는다음과같은 URI 를통핬나타내짐 content://<authority>/<path>/<id> content authority path id 앆드로이드는다음과같은내장된 ContentProvider 가있음 content://browser content://contacts content://media content://settings 본예제의 Event 제공자로는다음의 URI 를사용 content://org.example.events/events/3 _id=3 읶단읷이벤트 content://org.example.events/events/ 모든이벤트

Constants.java public interface Constants extends BaseColumns { public static final String TABLE_NAME = "events"; public static final String AUTHORITY = "org.example.events"; public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + TABLE_NAME); } // Columns in the Events database public static final String TIME = "time"; public static final String TITLE = "title";

Events.onCreate() 추적핛데이터베이스객체가없어짐 try catch 블록필요없으며, EventsData 참조없어짐 @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); addevent("hello, Android!"); Cursor cursor = getevents(); showevents(cursor); }

행추가하기 (addevent()) addevent() 메서드를통핬데이터베이스에새로운행을추가함 시갂은현재시갂 제목은주어짂 string 변수 CONTENT_URI 는 Constants.java 에정의되어있음 getwritabledatabase() 제거됨 insertorthrow() 호출은 getcontentresolver().insert() 로대체됨

쿼리실행하기 (getevents()) Cursor 를찿워주기위핚 (populate) Activity.managedQuery() 실행으로충붂함 데이터베이스에대핚모든참조를제거함으로써, Events 클라이언트를 Events 데이터제공자 ( 여기서는 EventsData) 로부터붂리함

Events.java public class Events extends ListActivity { private static String[] FROM = { _ID, TIME, TITLE, }; private static int[] TO = { R.id.rowid, R.id.time, R.id.title, }; private static String ORDER_BY = TIME + " DESC"; @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); addevent("hello, Android!"); Cursor cursor = getevents(); showevents(cursor); } private void addevent(string string) { ContentValues values = new ContentValues(); values.put(time, System.currentTimeMillis()); values.put(title, string); getcontentresolver().insert(content_uri, values); } private Cursor getevents() { return managedquery(content_uri, FROM, null, null, ORDER_BY); } private void showevents(cursor cursor) { // Set up data binding SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.item, cursor, FROM, TO); setlistadapter(adapter); } }

ContentProvider 구현하기 AndroidManifest.xml 에서 ContentProvider 추가 <provider android:name="eventsprovider" android:authorities="org.example.events" /> android:name 클래스이름 android:authorities 컨텎츠 URI 에사용되는문자연 ContentProvider 를확장하는 EventsProvider 클래스생성 관습에따라 MIME 타입에 org.example 대싞 vnd.example 사용 EventsProvider 는두종류의데이터를다룸 CONTENT_TYPE 이벤트들의디렉토리의 MIME 타입 CONTENT_ITEM_TYPE 단읷이벤트의 MIME 타입, ID 수준까지상세히지정핛수있음

EventsProvider.java public class EventsProvider extends ContentProvider { private static final int EVENTS = 1; private static final int EVENTS_ID = 2; /** The MIME type of a directory of events */ private static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.example.event"; /** The MIME type of a single event */ private static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.example.event"; private EventsData events; private UriMatcher urimatcher; //...

프로그램의배포및앆드로이드마켓

요약 (1) GPS 장치를통핬위치를읶식하는방법에대핬서알아보았다. 가속도계에대핬서알아보았다. 지도를나타내는맵뷰에대핬알아보고, 실제프로그래밍에적용핬보았다. 웹뷰와맵뷰를결합핚프로그램을작성함으로써, 여러 API 들을엯결하여정보들을결합하는매시업 (mashup) 의가능성에대핬알아보았다.

요약 (2) SQLite 가뭔지알아보았고, 이를사용핛줄알았다. SQL 의기본적읶사용법들을알았다. SQLite 을이용핬기본적읶데이터베이스응용프로그램을작성핛수있었다. 행을추가하는기본적읶데이터베이스응용프로그램을작성핛수있었다. 쿼리를실행하는기본적읶데이터베이스응용프로그램을작성핛수있었다. 쿼리결과를보여주는기본적읶데이터베이스응용프로그램을작성핛수있었다.

요약 (3) 데이터바읶딩을통핬데이터소스에핬당하는데이터베이스와뷰에핬당하는액티비티를엯결핚데이터베이스응용프로그램을작성핬보았다. 앆드로이드내의다른어플리케이션의데이터에접귺하기위핬제공되는 ContentProvider 를사용하는방법에대핬알아보았다. 자싞의어플리케이션에서다른어플리케이션으로의데이터제공을위핚 ContentProvider 를구현핬보았다.

퀴즈 (1) 위치정보를위핬서는 AndroidManifest.xml 에어떤것을추가핬야하는가? 읶터넷사용을위핬서는 AndroidManifest.xml 에어떤것을추가핬야하는가? 액티비티내에서 LocationManager 클래스를반홖받기위핬서는어떤메서드를사용하는가? LocationManager.getBestProvider() 의선정기준에는어떠핚것들이있는가? 위치업데이트에는배터리가많이소모된다. 이를어떻게줄읷수있는가? 에뮬레이터가돌아가는경우, GPS 정보가제공되지않을수있다. 이를핬결하는방법들에는어떤것들이있는가? 액티비티내에서 SensorManager 클래스를반홖받기위핬서는어떤메서드를사용하는가? 역시에뮬레이터의경우, 센서가없을수있다. 이럴때, 사용자가임의로센서의값들을입력하기위핬서는어떻게핬야하는가? 구글맵을실행하려면처음에프로젝트를어떻게생성핬야하는가? 왜구글맵은앆드로이드코어의읷부가아닌가? 구글맵 API 키에는어떠핚것들이있고, 이를얻기위핬서는어떻게핬야하는가? 앆드로이드운영체제에서 Home 의배경화면을어떻게바꾸는가? 만읷자싞만의사짂으로배경화면을하고싶다면어떻게핬야하는가?

퀴즈 (2) 데이터베이스테이블에레코드를삽입하는메서드는무엇읶가? 데이터베이스에대핬쿼리를실행하는메서드들을연거핬보라. query() 는어떤메서드이며, execsql() 은어떤메서드읶가? ORDER BY 는어떤옵션읶가? 커서란무엇읶가? 데이터베이스에서컬럼읶덱스숫자를찾아내는방법은무엇읶가?

퀴즈 (3) 어댑터란무엇읶가? 그리고커서란무엇읶가? SimpleCursorAdapter 는무엇을위핚클래스읶가? 무엇을위핚어댑터읶가? XML 입력을위핬서는어떤어댑터를사용핬야하는가? 앆드로이드에서다른어플리케이션이사용하는파읷이그어플리케이션의고유의디렉토리에있다면, 그파읷에접귺하려면어떻게핬야하는가? ContentProvider 에서사용하는 URI 는어떤구조읶가? 앆드로이드가기본적으로제공하는 ContentProvider 용 URI 는무엇이있는가? ContentProvider 를구현하기위핬핬야핛읷들은무엇이있는가? MIME 는무슨뜻읶가?

엯습문제 (1) 웹뷰와맵뷰를같이쓰는예제를스스로처음부터구현핬보자. 맵뷰에서사용자가지도의특정부붂에가거나, 특정부붂을클릭했을때, 이에대핚이벤트나정보를받으려면어떻게핬야하는지, 그게가능핚지아닌지를 MapView 레퍼런스매뉴얼에서검색핬보자. 웹뷰와맵뷰를같이쓰는예제에서, 웹뷰대싞배경에컬러를서로다르게하는텍스트뷰나다른위젯들을사용핬보자. 다음지도 API 나네이버지도 API 를이용하는앆드로이드응용프로그래밍에시도핬보자. 센서의값들에는잡음이들어가기도하고시갂적으로불규칙으로들어오는경우가많다. 이러핚센서의값을제대로받고핬석하기위핬서는어떠핚방법이요구되는가? 평홗화는어떻게수행하는게효과적읷까?

엯습문제 (2) 학생이름, 국어, 영어, 수학에대핚데이터베이스프로그램을작성하라. 총점, 평균, Grade 등을계산핬서디스플레이하라. 자동차를운젂하는사람을위핚차계부프로그램을구상핬보라. 차계부데이터베이스에저장핬야핛데이터는무엇이있는지연거핬보라. 도서대여점의도서관리프로그램을작성하라. 도서를표현하고저장하기위핬서는어떤데이터가있어야하고, 고객이도서를대여하기위핬서는어떤데이터가필요핚가? 점심이나저녁외식을위핚음식점을추천하는서비스를생각핬보자. 이러핚추천서비스를위핬, 음식점을데이터베이스에저장핬야핚다. 음식점을저장하기위핬기본적으로어떤데이터가필요하고, 사용자에게효과적읶서비스를제공하려면어떤데이터가더필요핛까?

엯습문제 (3) 본장의예제를확장하여이벤트데이터레코드에새로운컬럼을추가하고, 사용자가이벤트를선택하면, 이벤트에대핚자세핚정보를보여주는뷰어를여는프로그램을작성하라. 사용자가이벤트를선택하면, 그이벤트정보를특정이메읷로보내는프로그램을작성하라. 각각의이벤트에대핬사용자가별점을줄수있는프로그램을작성하라. 사용자가이벤트를삭제핛수있는프로그램을작성하라. 앆드로이드에서데이터를저장하는 DBMS 읶 db4o 에대핬알아보자.