이제 안드로이드 에서 제공하는 sqlite3 를 어떻게 연결하고 핸들링 하는지 알아보자. Sqlite3 는 안드로이드 SDK 에 포함되어 있기 때문에 따로 구해서 설치 하지 않아도 된다. (상세한 SQLite3 사용법은 http://www.sqlite.org/sqlite.html 에서 참고하면 된다) 여기에 사용한 소스는 http://code.google.com/android/intro/tutorial.html 에서 다운로드 받을수 있다.
1. Database Open/Create 안드로이드 에서는 SQLiteDatabase 라는 클래스를 제공하기 때문에 간편하게 slqite 를 다룰수 있게 해준다. Database 를 오픈하거나 생성하기 위해서는 Context 클래스에서 제공하는 openDatabase(String file, CursorFactory factory); 나 createDatabase(String name, int version, int mode, CursorFactory factory); 메쏘드를 사용해 주면된다. Context 는 Context 를 상속받은 하위클래스에서 오버라이딩 해서 쓰면 되겠다.. 대표적으로 Activity 는 Context 를 상속받았기 때문에 Activity 를 상속받은 사용자 생성 클래스에서 사용할 수 있다. SQLite 는 파일데이터베이스 이기 때문에 FileNotFoundException 으로 예외처리를 해주면 되고 openDatabase 할때도 첫번째 아규먼트로 Database 파일이름을 전달해주면 된다. 소스코드를 보면 database 를 열다가 예외가 발생하면 생성하는 코드를 볼수 있다. 실제로 sqlite 커맨드에서 sqlite3 data 했을때 database 가 존재하면 열고 없으면 생성하게 되어있다. 커맨드 부분은 마지막으로 살펴보겠다.
2. CRUD Insert -> createRow Select all -> fetchAllRows Select -> fetchRow 각 함수들을 통해서 CRUD 가 어떻게 일어나는 지는 금방 알수 있기 때문에 따로 설명하진 않겠다.
3. ADB 커맨드 사용하기 SQLite3 커맨드를 사용하기 위해서는 우선 adb 를 사용할 수 있어야 한다. ADB(Android Debug Bridge) http://code.google.com/android/reference/adb.html 는 안드로이드 개발을 위한 디버깅 툴이다. 우리가 지난 시간 SDK 를 설치할 때 설치 Root 아래 tools 까지 path 로 잡아준 적이 있다. 이 tools 안에 adb 가 있다. Command 창을 하나 열고 adb 라고 쳐보자 그럼 adb 를 이용하에 에뮬레이터 속으로 들어가보자. adb 는 에뮬레이터와 소켓통신을 하는 디버깅 툴이다. 일종의 C/S 로 보면 이해하기가 쉬울 것이다. 따라서 에뮬레이터는 서버이고 adb 는 클라이언트로서 접속할 서버가 당연히 있어야 하기 때문에 에뮬레이터가 구동되어 있어야 한다. 에뮬레이터를 띄우지 않고 접속 하려면 아래와 같은 메시지가 출력된다. 데몬이 안떠 있다는 것이다. 그리고 디바이스가 없다고 하네.. 그래서 에뮬을 띄워주고 다시 접속을 시도한다 접속이 되었다..이제부터 디버거 가 에뮬레이터와 다리 역할을 하면서 각종 메시지를 전달해 줄것이다. (그래서 debug bridge 라고 하는것이구만..) 자….저 “#” 은 어디서 많이 본 것 같다. 그렇다, 안드로이드가 리눅스 기반 이란건 알고 있을것이다. 저건 바로 쉘프롬프트 이다. 역시 에뮬레이터의 Root 디렉토리의 구조가 출력이 된다. 참고로 로컬머신에서 물리적인 패스를 찾을려고 하면 없을것이다. 찾지말자..찾느라 시간 많이 허비했다..;;; 4. SQLite3 접속하기 이제 sqlite3 에 접속을 시도해보자 제일 처음 database 를 생성했는데. 이 생성한 database file 는 어디에 있을까? Database 를 생성하면 파일은 /data/data/<package_name>/databases 아래에 생성된다. Root 에서 해당경로로 찾아가 보면 data 라는 sqlite3 Database file 이 보일 것이다. Database file 을 찾았으니 안을 봐야겠다. 접속명령어는 sqlite3 이며 인자로 database file 명을 주면 된다. 단 file명은 full path 를 주어야 하기 때문에 해당 파일이 있는 경로로 이동해서 접속을 하던가 아니면 full path 명을 주면 된다. 맨 처음 자바코드로 살펴보았듯이 여기서 data 라는 database 가 없다면 생성하고 있으면 오픈할 것이다. 이제 접속했으니 내용을 보자. 테이블 명령을 치니 “todo” 라는 테이블이 하나 나온다. 그럼 이 테이블 안의 row 를 보자. SQL 은 표준을 쓰니까 크게 걱정할 필요 없을 것 이고, 이렇게 데이터를 확인해보면 된다. Sqlite 는 파일을 사용하기 때문에 대단히, 엄청나게 빠르다..MySQL 과 비교해도 최소 2배 많게는 10배 이상 빠르다고 한다 물론 버그가 아직 존재하지만 모바일 디바이스에서 운용하기에는 이만한 DB도 없을것이다. ![]() Hierarchy of Screen Elements 개요 : 안드로이드 의 기본 클래스는 Activity(android.app.Activity) 클래스임. Activity 클래스는 아주 많은 것을 할 수 있지만 지 혼자서는 화면에 아무짓도 못한다. 이 Activity 클래스에 화면기능을 하기 위해서는 View, Viewgroups 와 항상 같이 작업을 해줘야 한다. 1. Views View(android.view.View) 클래스는 화면의 사각형 영역에 있는 컨텐츠나 화면 레이아웃 을 담당한다. 즉 화면영역에 오브젝트들을 배치하고,위치를 재고,그리고,포커싱을 바꾸고,스크롤을 하는등의 일을 한다. 또한 View 클래스는 위젯(화면에 어떤 것을 그리는 모든 행위를 하는 클래스들의 집합)의 기본 클래스이며, 이 위젯에 해당하는 클래스들로는 Text, EditText, InputMethod , MovementMethod, Button, RadioButton, Checkbox, and ScrollView. 등이 있다. 2. Viewgroups Viewgroup(android.view.Viewgroup) 은 화면의 Layout 이다. 즉 각각의 View 들을 합쳐서 전체 구조를 그리고 화면의 전체 Layout 을 그려낸다. 3. A Tree-Structured UI Activity 의 User Interface 는 View 와 Viewgroup 을 이용한 Tree 형태로 구성할 수 있다. 그림에서 보듯이 Viewgroup 이 다수의 View 를 포함하고 있고 Viewgrpup 도 포함하고 있는 것을 볼 수 있다. 예를 들면 RadioButton 컴포넌트를 여러개 둔 하나의 Viewgroup 을 만들수 있는 것이다. 이렇게 구성된 Tree 구조물을 화면에 표현하기 위해서 Activity 클래스의 setContentView() 메쏘드를 호출한다. 여기서, Activity 가 시스템으로부터 화면을 그려라, 또는 포커싱을 하라는 등의 노티를 받게 되면 트리의 최상위 root node 로 드로잉(Draw()) 요청을 하게된다. 이 Root node 는 요청을 받게 되면 하위 child node 까지 모두 드로잉 하라는 명령을 전달하게 된다. 4. LayoutParams: How a Child Specifies Its Position and Size 모든 Viewgroup 은 ViewGroup.LayoutParams 를 상속받은 nested class 를 사용한다. 이 서브클래스 는 하위 클래스의 크기,위치,프로퍼티 등을 정의한다.
모든 Viewgroup 은 width 와 height 를 가지고 있으며 다수의 Viewgroup 은 border, margin 값을 가지고도 있다. Common Layout Objects 다음으로는 어플리케이션에서 사용할수 있는 대부분의 Viewgroup 에 대해서 알아본다. 1. FrameLayout FrameLayout 은 가장 단순한 layout 중에 하나이다. 이 레이아웃은 빈 레이아웃 으로서 나중에 객체 하나를 넣을수 있게 되어있다. 얘를 들면 사진을 보여주는 틀에서 사진만 계속 교체되는 형태로 이 틀이 FrameLayout 이다. 2. LinearLayout LinearLayout 은 이름에서 볼수 있듯이 모든 children 을 한줄로 정렬하는 기능이다. Children(child noed 의 콤포넌트) 사이의 마진, 그리고 gravity(좌우중 정렬,) 도 제공한다. 그리고 LinearLayout 에는 weight 라는 개념이 있는데, weight 는 각 컴포넌트 들이 빈공간을 얼마나 미리 확장 시켜놓을수 있느냐 에 대한 설정 값이다. 쉽게 얘기하면 Html 에서 textbox 를 하나 만들고 태그로 size 를 줘서 미리 입력 사이즈를 확보하는 것과 같은 개념이다. 아래 그림을 예로 들면 좌/우 그림모두 gravity 는 left 이며, 좌측 은 weight 가 모두 디폴트값(0) 로 세팅 되어있다. Textbox 의 Width 는 FILL_PARENT(풀화면) 로 세팅되어 있고, 나머지 콤포넌트는 WRAP_CONTENT 로 세팅되어 있다. 반면 우측그림의 Comments textbox 는 weight 가 1 로 세팅되어 있다. Name textbox 를 1로 세팅했으면 Name 과 Comments textbox 의 height 는 같아졌을 것이다. Horizontal LinearLayout 은 첫번째 컴포넌트의 첫번째 텍스트 라인을 기준으로 나머지 콤포넌트를 정렬시키는 기능을 가지고 있다.(이러한 기능은 왠만한 4GL 툴에서는 메뉴로 제공하지만..) 이기능을 사용하지 않으려면 layout XML 에서 android:baselineAligned="false" 처럼 세팅하면 된다. 3. TableLayout TableLayout 은 말그대로 row 와 column 을 가지고 있는 테이블을 만든다. 그렇지만 Html 처럼 Border 는 표시되지 않는다. 아래그림에서 도트 표시되어 있는 라인이 실제로는 보여지지 않는다는 이해를 돕기 위해 임의로 표시해놓은 것이다. (테이블이 View 로 들어가지 않고 Layout 으로 들어간 것이 특이하다) 4. AbsoluteLayout 이번 레이아웃은 콤포넌트들을 X/Y 위치에 포커싱 하기 위한 레이아웃이다. Where(0,0) 하면 좌측 상단 꼭지점을 말한다.(일반적으로 JAVA Layout 과 같다고 생각하면 된다.) 주의할점은 Margin 이 지원되지 않으며, 권장할 만한 사항은 아니지만 콤포넌트 끼리 겹쳐서 포지셔닝 되는 것이 가능하다. 또한 AbsoluteLayout 은 정말로 잘 사용할 자신이 없으면 사용하지 않는 것이 좋다. 왜냐하면 디바이스 별로 다르게 동작할 수 있기 때문이다.(그래서 페이지에 딸랑 3줄로 설명이 되어 있었군요..) 5. RelativeLayout RelativeLayout 은 각 콤포넌트들 끼리 서로 위치에 대한 정보를 주고 받는 Layout 을 말한다. 기준이 되는 콤포넌트가 우선 하나 정해져야 하며, 나머지 콤포넌트 들은 기준 콤포넌트를 우선으로 해서 자신의 위치를 세팅할수 있다. 아래 그림을 보면. 기준이 되는 TextView 컴포넌트가 우선 자리를 잡고 있다. 그아래 EditText 의 below 항목을 보면 “label1” 으로 되어 있다. 이것은 기준 콤포넌트인 TextView 의 ID 가 되겠다. 그러니까 TextView 의 아래에 나 EditBox 가 위치하고 있다는 것을 의미한다. RelativeLayout 클래스의 Constants 를 살펴보면 POSITION_BELOW , POSITION_ABOVE 등이 있는 것을 확인할 수 있다. [그림-5] RelativeLayout JAVA application 을 작성할 때 VB 나 델파이 같이 콤포넌트를 척척 갖다 붙여서 쉽게 UI 를 구성하는 모습이 가장 부러웠다. 물론 JBuilder 같은 툴을 이용한다면 JAVA 도 위지윅 하게 작업을 할수 있겠지만 자바의 가장 골치하픈 Layout 을 벗어나서 UI 를 구성하기는 어렵다. 안드로이드 Layout 은 자바 기본패키지에 있는 Layout 보다 많이 컴팩트 하게 구성되어 있지만 PC 환경에서 해상도 에 대한 부담없이 setX, setY 등으로 프로그래밍할 때와는 달리 디바이스별 해상도 에 대해 철저하게 대비해야 하는 점이 개발자로서는 부담으로 다가온다. 한국에서 RelativeLayout 이나 LeanerLayout 으로 해상도별로 탄력적인 UI 를 구성했다면 아마 대부분의 Client 들은 이 UI 에 만족하지 못하고 좀더 매뉴얼하게 배치할수 있는 AbsoluteLayout 으로 작업해서 디바이스별로 여러벌의 버전을 제공하길 바랄것이다. 하지만 새로운 디바이스가 출시될 때마다 개발자들은 가슴을 쓸어내려야 할 것이다.. 이전 포스트에서는 이클립스로 Android 개발환경을 설정하는것을 해봤습니다. 이제 Hello world 를 안찍어볼수가 없죠.. 참고로 에뮬레이터 에 여러가지 테스트 어플들이 있고 SDK Sample 디렉토리에도 샘플이 있으니 프로젝트 생성해서 소스 땡겨 돌려보면 여러가지 신기한 기능들을 볼수 있습니다...
1. 프로젝트 만들기 - File->New 를 해보면 Android Project 라는 메뉴가 생긴것이 보인다. 선택해준다.. ![]() ![]() - 프로젝트 생성창에 필드들을 입력한다. Project name : 원하는 명을 입력 Package name : 역시 원하는것 입력 Activity name : Activity 는 안드로이드의 기본이 되는 클래스로 UI 를 생성해주고 기타 많은 역활을 한다. 원하는 클래스명을 입력해주면 된다. Application Name : 프레임의 타이틀이다..원하는것 입력 - 끝으로 Finish 해준다.. ![]() - 프로젝트가 생성되고 Activity 클래스에 기본 코드가 생성되어 있는것을 볼수 있다. - 클래스에 대한 부연설명을 하자면 Activity 클래스는 Context 클래스를 상속하고 있다..이 Context 클래스는 시스템과 관련이 있어서 리소를 관리해주고 DB 를 액 세스 하는 등의 기능을 가지고 있다.(참고로 안드로이드는 sqlite3 Database 를 사용한다) TextAndroid 클래스가 Activity 를 상속받아서 작성되었기 때문에 이클래스 역시 Context 에 해당한다.
- 그럼 기본 코드에 약간의 수정을 해본다(구글 사이트에 샘플로 있는 소스) ![]() - 안드로이드에서 UI 를 담당하는 최상위 클래스는 View 클래스이고 이 View 클래스를 상속받은놈 중에 하나가 TextView 이다.. 이 VIew 클래스는 버튼이나 그림, 텍스트 등을 그리는 역활을 한다. TextView 의 생성자의 아규먼트로 this 가 들어가는데 this 는 Activity 를 상속받은 TestAndroid 클래스이고 위에서 따라서 텍스트를 Context 에 그리겠다는 의미로 보면 되겠다.. - 그다음은 백그라운드 칠하고 텍스트를 뿌린다..(쓰다보니 Hello world 가 아니네;;) - 이제 TextView 클래스가 배경을 칠하고 텍스트를 뿌렸으니 화면으로 봐야겠다.. setContentView 메쏘느는 Activity 클래스 메쏘드로 그려진 Context 를 디바이스에 뿌리게 된다. ![]() - 아...이미지가 찌그러지네..; 좌측 Android Application 우클릭해서 New 로 실행환경 프로파일을 하나 만든다. ![]() ![]() ![]() - 새로만든 프로파일에서 Name : 아무꺼나 Project : 브라우징하면 위 화면과 같이 현재 활성화 되어있는 프로젝트 리스트가 나온다. 어차피 한개 밖에 없으니 Activity : 콤보박스를 내려보면 선택된 프로젝트의 Activity 클래스가 디스플레이 된다. 어차피 한개밖에 없으니 - 그리고 Run~ ![]() - 우측에 구글폰의 사이버틱한 에뮬이 보인다.(아..막간을 이용해 영화 다운받고 있는게 보이는군요..-_-) 그런데...이상하게 어플리케이션이 보이질 않네.. 이것때문에 삽질좀 했는데. 에뮬을 미리 띄워놓아야 한다... 방금처럼 Run 으로 실행시켜도 되고 SDK 설치경로에 tools 디렉토리에 로버트 모양의 아이콘으로 에뮬레이터 사실 이부분은 이렇게 하는게 맞는지 잘모르겠다..왠지 좀 찝찝하지만..그래도 Hellow world 를 볼수 있으니... ![]() - Hello world 가 아니라 Wonderful Korea 가 찍혔네...;;
이제 새롭게 모바일 O/S 시장에 출사표를 던진 안드로이드가 어떻게 진화해 나갈지 무척 궁금하다.. 천만달러 의 상금을 내걸고 세계의 개발자들을 유혹하는 구글...그돈탈려면 지금부터라도 밤을 새야하나.....
@ 틀린부분이 있으면 리플해주시면 저한테 많은 도움이 되겠습니다.. ![]() 오늘 구글에서 Android SDK 를 오픈했다는 기사를 보고 부리나케 다운받아서 이것저것 해보았다.. 새로운 개발환경은 개발자들에겐 언제나 기쁨이자 고통이 되지만 해볼건 해봐야지... 안드로이드 사이트에 워낙에 설명을 친절하게 잘 해놓아서 굳이 설명이 필요없겠지만.. 나중에라도 다시 볼때를 대비해서 .... 참고로 설치방법은 이클립스 사용자만 해당하니까 다른 툴을 사용하거나 커멘드 라인에서 작업 하시는분들은 따로 자료를 찾아보시길...
1. 우선 Android SDK 를 다운받는다. 아래 사이트에서 O/S 환경에 맞는 버전을 다운받는다. http://code.google.com/android/download.html
2. 이클립스에서 Android Development Tools (ADT) 를 플러그인 - Help->Software Updates->Find and Install 메뉴를 불러온다 ![]() 3. ADT 를 받아올 사이트를 추가한다. - New Remote Site 클릭 ![]() ![]() ![]() - 사이트 접속하는 과정이 보이고 아래와 같은 화면이 나온다.. ![]() ![]() ![]() ![]() ![]() ![]() - Install All 을 해준다... - 이로서 ADT 를 이클립스에 플러그인이 완료되었다...
3. SDK 설치. - 다운받은 SDK 를 적당한 위치에 압축을 해제한다. - 환경변수 Path 에 SDK 가 풀린 곳의 하위폴더중 tools 까지 패스를 잡아준다. ![]() - 그리고 이클립스의 Windows->Preferences 를 불러와서 왼쪽 트리메뉴에서 Android 를 선택한다. SDK Location 에 SDK 의 Root 경로까지 선택해준다.. ![]() ![]()
|
메뉴릿
카테고리
최근 등록된 덧글
최근 등록된 트랙백
이전블로그
이글루링크
이글루 파인더
|