[next] android 개발 경험 프로젝트 3일차 (database)

164
ANDROID - DAY 3. DATABASE를 만나러 가다.

Post on 20-Oct-2014

2.889 views

Category:

Technology


15 download

DESCRIPTION

NEXTGRAM을 만들기 위한 여정 3일차 Android Database 프로그래밍을 맛 보는 수업입니다. Written by 정문철 Reviewed by 손영수

TRANSCRIPT

Page 1: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

ANDROID����������� ������������������  -����������� ������������������  DAY����������� ������������������  3.����������� ������������������  ����������� ������������������  ����������� ������������������  DATABASE를����������� ������������������  만나러����������� ������������������  가다.

Page 2: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

학습목표이 학습을 마치면…

-SQLite를 사용하여 앱 내부의 데이터베이스를 사용하여 자료를 보관할 수 있습니다. !-JSON방식의 파일을 파싱하여 안드로이드 내부에서 활용 할 수 있습니다.

Page 3: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이때까지 HTML로 구현한 게시판을 안드로이드 플랫폼에서 다시 구현을 합니다.

Page 4: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

하지만 서버(백엔드)부분은 공통적으로 이용을 하므로

클라이언트(프론트엔드) 부분만 다시 만들면 됩니다.

Page 5: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

지금까지 버튼, 텍스트뷰 등 각종 위젯이나 커스텀 어뎁터를 사용한 리스트 뷰등 UI관련된 API들을 사용법을 배웠는데

!지금부터는 네트워킹,DB등의 여러 부분을 같이?! 해야 합니다.

Page 6: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

안드로이드로 웹에 있는 게시글들을 보고 원하는 글을 보거나 사진을 올릴수 있는

게시판 앱을 만들고 싶다! !

-NEXTAGRAM-

앱 기획

Page 7: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

메인화면

메인화면에는 게시글들을 볼 수 있고…

Page 8: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

메인화면

글 읽기

게시글 하나를 터치하면 내용을 볼 수 있고.

Page 9: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

메인화면

글 읽기

글쓰기 버튼을 터치하면 게시글 입력 창이 나오고

Page 10: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

메인화면

글 읽기

앨범에 있는 사진을 선택하고

Page 11: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

메인화면

글 쓰기

글 읽기

글쓰기 버튼을 누르면 글이 업로드되서

새로 리스트에 추가가 된다.

Page 12: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

메인화면

글 쓰기

글 읽기

Page 13: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Proxy

Dao

ProxyUP

SERVER이때까지 만든 서버

안드로이드 메인 클래스

(게시글 목록)

서버 데이터 로드 클래스 서버 데이터 업로드 클래스

안드로이드폰 자체의 DB(SQLite)에 데이터를 관리하는 클래스

Page 14: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Proxy

Dao

ProxyUP

SERVER

1)데이터 요청

Page 15: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Proxy

Dao

ProxyUP

SERVER

1)데이터 요청

2)서버로 부터JSON으로 데이터 받음

Page 16: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Proxy

Dao

ProxyUP

SERVER

1)데이터 요청

2)서버로 부터JSON으로 데이터 받음

3)서버로부터 받은 데이터를 전달

Page 17: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Proxy

Dao

ProxyUP

SERVER

1)데이터 요청

2)서버로 부터JSON으로 데이터 받음

3)서버로부터 받은 데이터를 전달

4)JSON 데이터를 Dao에 전달

Page 18: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Proxy

Dao

ProxyUP

SERVER

1)데이터 요청

2)서버로 부터JSON으로 데이터 받음

3)서버로부터 받은 데이터를 전달

4)JSON 데이터를 Dao에 전달

5)JSON 데이터를 파싱하여 SQLite에 insert하기

Page 19: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Proxy

Dao

ProxyUP

SERVER

1)데이터 요청

2)서버로 부터JSON으로 데이터 받음

3)서버로부터 받은 데이터를 전달

4)JSON 데이터를 Dao에 전달

6)Dao에 저장되어 있는 게시글 데이터를 가져오기

5)JSON 데이터를 파싱하여 SQLite에 insert하기

Page 20: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Proxy

Dao

ProxyUP

SERVER

1)데이터 요청

2)서버로 부터JSON으로 데이터 받음

3)서버로부터 받은 데이터를 전달

4)JSON 데이터를 Dao에 전달

5)JSON 데이터를 파싱하여 SQLite에 insert하기

6)Dao에 저장되어 있는 게시글 데이터를 가져오기

7)Dao로 부터 가져온 데이터를 리스트에 표시

Page 21: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Proxy

Dao

ProxyUP

SERVER

7)Dao로 부터 가져온 데이터를 리스트에 표시

ArticleWrite8)글 입력 창으로 이동

Page 22: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Proxy

Dao

ProxyUP

SERVER

7)Dao로 부터 가져온 데이터를 리스트에 표시

ArticleWrite8)글 입력 창으로 이동 9)글 제목,내용, 사진 경로등을 전달

Page 23: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Proxy

Dao

ProxyUP

SERVER

7)Dao로 부터 가져온 데이터를 리스트에 표시

ArticleWrite8)글 입력 창으로 이동 9)글 제목,내용, 사진 경로등을 전달

10)post방식으로 서버에 사진 전송

Page 24: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)
Page 25: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Q) 불필요한 구조가 많은것 같은데? !

A) Main에서 Proxy로 갔다 다시 메인으로 와서 Dao로 갔다가 또 Main으로 돌아 오는 등 불필요한 부분이 있습니다.

!이것은 절차지향적인 설계로 보다 쉽게!? 학습을 위해서 입니다.

Advanced를 목표로 하는 학생은 독자적으로 설계를 해서 구현을 하셔도 무방합니다.

Page 26: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Advanced한 설계를 원하시는 분은 구글에서 권장한 이 방법을 참고해 주세요

http://~~~

Page 27: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

네 많이 복잡하고 어려워 보입니다…

Page 28: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

하지만 천리길도 한걸음 부터!

!

그나마 익숙?! 한 DB를 먼저 구현해 보겠습니다.

Page 29: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Dao4)JSON 데이터를 Dao에 전달

6)Dao에 저장되어 있는 게시글 데이터를 가져오기

5)JSON 데이터를 파싱하여 SQLite에 insert하기

SQLite 데이터베이스를 관리하는 클래스

DAO (Data Access Objects) 클래스

Dao라는 클래스를 만들어 데이터를 저장하고 불러오는 과정을

먼저 구현해 보겠습니다.

Page 30: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Dao

5)JSON 데이터를 파싱하여 SQLite에 insert하기

Q) DB를 왜 사용하나요? !

A) 안드로이드 자체의 DB를 사용함으로써 네트워크가 불안정한 상태에서도 게시글의 내용을

화면에 표시를 하는 것이 가능합니다. !

특히 해외는 이제서야 3G가 보급되기 시작되고 불안정한 곳도 많기 때문에 꼭 네트워크가 불안정한 상태를 가정하고

설계를 해야합니다. !

그 외에도 앱 실행 후 빠르게 게시글 내용이 보이는등 여러 장점이 있습니다.

Page 31: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

안드로이드 SQLite사용하기

SQLITE CRUDCreate(생성), Read(읽기), Update(갱신), Delete(삭제)

Page 32: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

SQLite란?

SQLite는 MySQL같은 데이터베이스 관리 시스템으로 !

서버가 아니라 응용 프로그램에 넣어 사용하는 비교적 가벼운 데이터베이스로

대규모 작업에는 적합하지 않지만, 중소 규모라면 속도에 손색이 없다. !

또 API는 단순히 라이브러리를 호출하는 것만 있으며 데이터를 저장하는 데 하나의 파일만을 사용한다.

!안드로이드에는 기본 탑재되어 있어 손쉽게 이용이 가능하다.

Page 33: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

SQLiteDB는 파일하나로 구성되어 있으며 쉽게 DB통째로 복사 및 이동이 가능합니다.

!이번예제에서 사용하는 방법은

/data/data/<package_name>/databases/<DB이름>.db 에 저장이 됩니다.

!따로 WRITE_EXTERNAL_STORAGE 권한이 필요없으나

루팅이 안되어 있는 디바이스에서는 data폴더에 접근을 하지 못합니다. !

SQLite파일을 보고 싶으시면 DDMS나 루팅이 되어있는 디바이스, AVD(Genymotion)상에서 확인이 가능 합니다.

SQLite란(2)?

Page 34: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

SQLite DB 생성하기

SQLite에서는 데이터를 넣기 위해서는 Table생성보다 먼저 데이터 베이스를 먼저 생성을 해야 합니다.

SqLiteDatabase를 import한 다음 openOrCreateDatabase를 사용하여 DB파일을 생성거나 DB파일을 읽어줍니다.

Page 35: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

안드로이드에서 제공하는 DB 메소드들이 있지만 JDBC와 동일한 방식으로 DB제어방법을 소개합니다.

Page 36: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

테이블 생성

sql문은 MySql과 동일하며 execSQL()로 실행합니다.

!(AutoIncrement ID와 TITLE을 가지는 테이블)

테이블이름 컬럼들…

주의! sqlite에서는 AUTO_INCREMENT가 아니라

AUTOINCREMENT입니다.

Page 37: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

테이블 삭제

sql문은 MySql과 동일하며 execSQL()로 실행합니다.

테이블이름

Page 38: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

데이터 입력

sql문은 MySql과 동일하며 execSQL()로 실행합니다.

테이블이름 컬럼명 입력할 데이터

Page 39: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

데이터 삭제

sql문은 MySql과 동일하며 execSQL()로 실행합니다.

테이블이름 ID값이 동일한 것을 삭제

Page 40: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

데이터 수정

sql문은 MySql과 동일하며 execSQL()로 실행합니다.

테이블이름 수정할 데이터 수정할 데이터의 ID

Page 41: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

데이터 읽기

sql문은 MySql과 동일하나 Cursor를 만들고 rawQuery()로 실행합니다.

Page 42: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Cursor

Cursor는 DB의 한행 한행씩 읽어오는데 편리하도록 만들어진 인터페이스로 while문으로 데이터가 끝날때까지

반복작업을 할 수 있습니다.

Page 43: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Cursor(2)

Cursor로부터 getString(columnIndex), getInt(columnIndex)로 각 행마다의 데이터를 가져올 수 있습니다.

!인자는 컬럼 번호를 뜻합니다.

0 1 2 3

Page 44: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Cursor(3)

Cursor는 꼭 .close()를 해주지 않으면 메모리 누수가 발생하므로 꼭 사용후에는 닫아줍시다.

Page 45: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

DB가 오류나면 앱이 바로 종료되요!

Page 46: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

TRY CATCH!

중복으로 테이블을 생성한다던지 유니크인 칼럼에 중복데이터를 넣는다던지 등등

!try catch문으로 오류가 발생하여도 문제가 없도록 예외처리를 해서

앱이 멈추지 않고 계속 진행하도록 합니다.

Page 47: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

테이블 중복 확인을 위한 쿼리로 보호

테이블을 중복 생성을 하려고 하면 오류가 발생합니다. CREATE TABLE하기 전에 테이블이 중복이 있는지 확인하는

쿼리를 날리던지

Page 48: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

아니면 create table if not exists 등으로 쿼리를 잘 짜야하던지 등등

!

여러 상황이 있을 수 있고 여러 해결 방법이 있지만 그래도 Try Catch는 생활화 합시다.

Page 49: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

안드로이드에서 DB를 사용할 때에는 일반적인 SQL문을 직접 작성해서 질의를 할 수 있지만

안드로이드 API를 사용할 수도 있습니다. !

sql문을 입력하는 것과 차이는 없지만 api를 사용하면 컬럼명이나 기타 변경점에 유연하게 대응할 수 있습니다.

!학습 진행에 여유가 있으신 분은

http://developer.android.com/training/basics/data-storage/databases.html 을 참고해 주세요

Page 50: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이제 본격적으로 게시판 앱을 만들어보겠습니다!

Page 51: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

메인화면

글 쓰기

글 읽기

저번 과제로 레이아웃을 만들었던 프로젝트에서 작업을 시작합니다

Page 52: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Main

Dao4)JSON 데이터를 Dao에 전달

6)Dao에 저장되어 있는 게시글 데이터를 가져오기

5)JSON 데이터를 파싱하여 SQLite에 insert하기

SQLite 데이터베이스를 관리하는 클래스

DAO (Data Access Objects) 클래스

Dao클래스를 만들고 DB에 JSON데이터를 저장하는

방법을 배워봅니다.

Page 53: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

기존에 작업하시던 프로젝트에서 새 클래스를 만들어줍시다.

마우스 오른쪽 클릭!

Page 54: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

클래스명은 Dao (Data Access Objects)로 하였습니다.

Page 55: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

무사히?! 빈 클래스가 생겼습니다.

Page 56: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

DB를 제어하기 위해서는 Context가 필요합니다. 생성자를 만들고 Context를 받아줍니다.

Page 57: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

SQLiteDatabase의 인스턴스를 만들고 openOrCreateDatabase()로 초기화를 합니다.

Page 58: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이제 DB 테이블을 만들어야 합니다.

Page 59: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이 예제에서는 다음과 같은 테이블을 사용합니다.

ID - primary key값 ArticleNumber - 게시글 번호 중복X Title - 글제목 WriterName - 작성자 WriterID - 작성자ID Content - 글내용 WriteDate - 작성일 ImgName - 사진 파일명 중복X

테이블을 짜실 때에는 기존의 웹기반 게시판에서 보내주는 JSON형태의 데이터를 사용하시면됩니다.

Page 60: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

테이블 쿼리를 만드시고 execSQL()로 실행하시면 됩니다. (꼭 저렇게 만드실 필요는 없습니다!!)

Page 61: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이제 JSON형태의 데이터를 SQLite에 넣어봅시다.

Page 62: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

하지만 아직 네트워킹을 위한 클래스가 준비되지 않았으므로 테스트용 JSON 문자열을 파싱하여

DB에 넣어보겠습니다.

Page 63: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

아래의 주소에서 getJsonTestData()함수를 복사하여 붙여넣어주세요 http://pastebin.com/FPFZAh6L

그냥 String문자열이지만 JSON형식을 띄고 있는 임시 데이터입니다.

Page 64: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

String형태의 JSON 데이터를 인자로 받아 파싱한 후 바로 DB에 넣어주는 함수를 만들어 봅시다(이름 자유)

Page 65: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

우선 코드가 눈에 쉽게 들어오도록 JSON 데이터의 형식에 맞게 필요한 항목을 변수로 만들었습니다.

Page 66: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

1

2

3

JSON데이터는 여러개의 데이터를 같이 갖고 있습니다.

Page 67: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

JSON데이터를 JSONArray에 넣어서 여러 데이터를 하나의 배열로 관리를 합니다.

Page 68: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

JSONArray의 끝까지 반복하는 것은 length()를 사용한 for문으로 쉽게 사용 가능합니다.

Page 69: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

getJSONObject(index)를 하면 배열로부터 한 데이터를 가져올 수 있는데

!JSONObject에 getInt()나 getString()등등을 쓰면

원하는 데이터를 가져 올 수 있습니다.

Page 70: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

잘 되고 있는지 확인조차 할 수 없는

먼길을 오시느라 힘드셨죠?? !

DB에 데이터를 넣기전에 JSON을 잘 파싱하는지

!

확인을 해보겠습니다.

Page 71: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

우선 Log.i()를 사용해 데이터가 잘 파싱되고 있는지 확인을 해보겠습니다.

Page 72: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

다시 Main Activity로 돌아가 Dao를 생성해줍니다.

!Dao의 생성자로 넣어줬던 Context는

getApplicationContext()로 전달해줍니다.

Page 73: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Dao나 다른 클래스로 부터 있던 테스트 JSON데이터를 가져옵니다.

Page 74: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

아까 전에 만든 파싱 함수에 테스트 데이터를 넣어줍니다.

Page 75: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이제 제니모션을 실행하고 테스트를 해봅시다!

Page 76: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Run As Android Application으로 앱을 실행시키고…

Page 77: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

제니모션을 선택해서 앱을 실행시킵니다.

Page 78: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

내가 원하는 로그만 골라서 보기 (시간이 여유있을때 보세요!)

Page 79: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

LogCat으로 데이터를 확인하여는데 데이터가 너무 많아서 확인이 힘듭니다!

Page 80: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

로그캣에서 + 버튼을 눌러 필터 설정창을 표시합니다.

필터창이 안보일경우 클릭

Page 81: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

로그캣에 는 태그를 정해줄수 있는데 태그정보로 로그를 정리해서 볼 수 있습니다.

Page 82: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

FilterName을 정해주고 Log Tag에 로그에 썻던 Tag를 넣어주면

Page 83: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

내가 사용한 로그만 필터링해서 보여줍니다!

!(Tag명으로 test라고 쓰는건 좋은 습관은 아닙니다.)

Page 84: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

로그 종류에 따라 로그의 색이 달라집니다.

Page 85: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이번에야말로 JSON이 잘 파싱되었는지 로그를 볼까요?

Page 86: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

로그로 잘 JSON이 파싱된 것을 확인 할 수 있습니다.

Page 87: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이제 잘 파싱된 데이터를 DB에 넣어 봅시다.

Page 88: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

다시 Dao클래스로 돌아와 JSON을 파싱해주던 함수로 돌아옵니다.

Page 89: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

파싱 부분 아래쪽에 INSERT 쿼리문을 작성해 줍시다. (실수하기 쉬운 곳이므로 주의!)

!

작성 후에는 쿼리문을 execSQL()로 실행시켜줍니다.

Page 90: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

INSERT문을 사용할 때 Unique값을 중복해서 집어넣으면 오류가 발생할 수 있으므로

try catch로 미연에 방지합니다. (좋은 DB설계는 저런 상황이 발생하지 않도록 잘 설계하는것입니다..)

Page 91: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

앱을 실행시키고 DB에 값이 잘 저장이 되어있는지 확인해 봅시다.

Page 92: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

SQLiteDebugger가 없으면 제니모션에

설치를 해주세요 !

APK파일은 이 주소에서…

http://ui.nhnnext.org/crong/scope/android/week3/SQLiteDebugger.apk

Page 93: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

기본적으로 DB에 접근하려면

root권한이 필요합니다. !

아직 권한을 안주셨으면 Allow를 눌러주세요

Page 94: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

App을 터치하고…실습 앱을 선택합니다. (자신의 앱 이름 확인)

Page 95: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이 이름과 동일

Page 96: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

테이블을 선택하고 SELECT쿼리를 실행시켜보면…

Page 97: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

무사히 데이터가 들어간 것을 확인할 수 있습니다.

Page 98: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

?

INSERT

DB에 데이터를 넣는것까지 성공을 했지만…

Page 99: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

아직까지 DB의 내용을 가지고 와서 사용하는 방법이 없습니다.

Page 100: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

-ArrayList -UI레이아웃

Adapter

저번 시간에 배운 ArrayAdapter를 사용해 메인 화면에 리스트로 표현해 보겠습니다.

Page 101: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

저번수업에 했던 내용 그대로 게시글 데이터를 담을 클래스를 만듭니다.

Page 102: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이름은 Article로 하였습니다.

Page 103: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이제 이 빈클래스에 생성자로 게시글 정보를 받고, get함수들을 만들 예정입니다.

Page 104: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Dao에서 사용했던 변수들을 그대로 사용해 주시면 됩니다… !

(반복해서 말씀드리지만 각자의 데이터 형식에 맞게 변경을…)

Page 105: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

생성자로 데이터들을 다 입력하였습니다…

Page 106: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

get 함수들은 좀 쉽게하기 위해 이클립스의 자동 생성 기능을 사용해보겠습니다.

Page 107: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Select Getters를 누른후에 OK를 누르면…

Page 108: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이클립스가 잘 만들어 주었습니다^^

Page 109: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

다시 Dao로 돌아와 DB의 내용을 반환해주는 함수를 만들어보겠습니다.

!Adapter에서 바로 사용할 수 있도록

ArrayList<Article>형태로 반환을 합니다.

Page 110: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

DB에서 꺼낼때 잠시 받아둘 임시 변수를 만듭니다. !

(데이터의 형태는 동일 하므로 또 복붙을 하셔도 무방합니다…)

Page 111: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

ArrayList<Article>를 만들고 반환도 List가 되도록 합니다.

Page 112: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이제 DB에서 데이터를 꺼내봅시다.

Page 113: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

SELECT 쿼리문을 rawQuery()를 사용하여 Cursor를 만들고

while문을 사용하여 DB를 끝까지 반복하는 명령문을 만들었습니다.

Page 114: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Cursor로부터 get함수를 이용해 DB로부터 데이터를 받아와 Article로 감싼 다음 ArrayList에 삽입하고 리턴합니다.

(index 0은 id값이므로 1번부터 받아옵니다.)

Page 115: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

-ArrayList -UI레이아웃

2 3

4 5 6

7 8 9

1

1234…

1 2 3 4 …

ListView

Gallery

GridView

AdapterArrayList

하나의 요소 UI를 구성할 레이아웃 파일

제대로 된 안드로이드 앱 개발을 위한 안드로이드 프로그래밍 / 진성주 최종렬 백정현 신중훈 공저

Adapter의 개념

저번 시간에 한 것처럼 Adapter를 만들어 줘야합니다.

Page 116: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이제 DB데이터를 메인화면의 리스트에 출력을 해보겠습니다.

Page 117: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Adapter용으로 사용할 레이아웃은

저번시간 예제와 동일하니 복붙하셔도 무방합니다.

Page 118: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

저번 시간에 사용한 CustomAdapter코드를 복사하여 사용하도록 하겠습니다.

(Adapter를 만드는 법은 2주차 강의 자료 참고!)

Page 119: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

전에 만든 프로젝트의 CustomAdapter.java 파일을 복사해서…

Page 120: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

NEXTAGRAM 프로젝트에 파일을 붙여넣기 해줍니다…

Page 121: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

엄청난 빨간줄들…

Page 122: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

우선 package 이름을 수정합니다.

Page 123: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

클래스 명도 Professor에서 Article로 바꾸었습니다.

Page 124: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

profData → articleData TextView tvName → tvTitle

TextView tvVillage → tvContent

변수명도 상황에 맞게 바꾸어 줍시다. (eclipse의 Refactor-Rename을 사용하면 편합니다.)

혹 TextView의 ID가 달라졌으면 새 레이아웃에 맞게 ID도 바꾸어 주세요

Page 125: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

get 함수명도 Article 클래스에 맞게 바꾸어 줍시다.

getName() → getTitle() getVillage() → getContent()

getImgPath() → getImgName()

Page 126: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Assets폴더에 테스트용 사진을 복사합니다.

Page 127: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

테스트 사진은 여기에서 다운받아 주세요

!ui.nhnnext.org/crong/scope/android/week3/photo.zip

Page 128: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

다시 MainActivity로 돌아와 Dao로 부터 ArrayList를 받아서 ListView에 Adapter를 적용시킵니다.

Page 129: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

다시 한번 테스트를 해보겠습니다.

Page 130: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

리스트로 잘 보여지고 있습니다^^

Page 131: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

생각해 봅시다.

게시글 내용 부분이 리스트에 다 표시되고 있습니다.

!만약 게시글의 내용이 길면

어떻게 될까요? !

그러면 어떻게 하는것이 좋을까요?

!Advanced를 목표로 하는 학생은 이 문제를 해결해주세요!

(지옥 관찰중)

Page 132: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이제 글 상세보기 화면을 만들어 보겠습니다. (과제로 만드셨던? Activity입니다.)

Page 133: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)
Page 134: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

레이아웃은 ImageView한개와

TextView4개로 만들었습니다. !

(좋은 레이아웃이 아닙니다! 직접 공들여 만들어보세요!!)

Page 135: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

메인에서 리스트를 선택하면 상세보기 페이지로 넘어가도록 이벤트를 만들어 봅니다.

Page 136: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

OnItemClickListener를 받은 다음 ListView에 setOnItemClickListener()로 리스너를 달아줍니다.

Page 137: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

OnItemClickListener를 정의하고 ArticleViewer로 이동하는 Intent를 만들어 줍니다. 이때 Article값을 같이 붙여서 보내줍니다.

Page 138: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Intent에서 데이터를 다른 Activity로 전달을 할 때 String이 아닌 Article객체를 통채로 넘겨줄수도 있지만

객체를 넘기기위해서는 Parcelable(자바의 Serialization과 유사)을 사용해야 하는데 이 예제에서 다루기에는 복잡하므로

!!

Advanced를 목표로 하는 분만 Parcelable에 대해 학습을 해봐 주세요^^;

http://developer.android.com/reference/android/os/Parcelable.html

Page 139: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이제 게시글을 보여주는 ArticleViewer Activity에서 작업을 합니다.

Page 140: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

우선 위젯들을 정의합니다.

Page 141: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

메인 Activity에서 보낸 게시글 번호를 ArticleViewer에서 받아옵니다.

MainActivity

Page 142: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

하지만 가지고 있는것은 게시글 번호 뿐… 게시글 내용을 보여줄 글제목이나 글내용등등

!

Article안의 내용물들이 없습니다…

Page 143: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

다시 Dao로 돌아가서 DB로부터 게시글 번호로 검색해서

!

게시글 내용을 반환해주는 함수를 만들어야합니다.

Page 144: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

Article을 찾아오는 함수의 내용은 전에만든 내용과 거의 같으므로 기존에 ArrayList를 반환해주던 함수를 복사해서 재사용합니다.

Page 145: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

1단계. 중복되는 함수 이름 변경 (ex. getArticleList() → getArticleByArticleNumber() )

Page 146: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

2단계. 반환하는 데이터 타입 변경 (데이터가 하나이므로 List가 필요없습니다.)

( ArrayList<Article> → Article )

Page 147: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

3단계. 찾을 데이터의 게시글 번호를 인자로 받습니다.

Page 148: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

4단계. SQL문을 수정해 게시글 번호로 검색하도록 합니다.

Page 149: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

5단계. 데이터는 하나만 검색되므로 while문이 필요없으므로 삭제합니다.

Page 150: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

ArticleViewer에서 방금 만든 Dao의 함수를 사용하여 Article을 받아옵니다.

(인자가 int여서 형변환을 사용하였습니다…)

Page 151: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

가져온 Article로부터 데이터를 꺼내서 위젯에 데이터를 삽입합니다.

Page 152: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

데이터가 잘 표시되고 있습니다^^

기기 해상도에 따라 이미지가 너무 크거나 작게 보일 수 있습니다.

!그림의 픽셀은 일정한데

해상도에 맞게 그림의 크기가 변화되지 못해서입니다.

!이 문제점도

Advanced를 노리는 분은 Bitmap Resizing을 참고해주세요!

Page 153: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

생각해 봅시다.

Dao로부터 ArrayList로 Article들을 가져오는데 리스트는 사진, 글제목, 글내용밖에 없는데

Article의 내용을 다 가져오고 있습니다. 다른 방법은 없을까요? !

동일한 함수를 반복해서 사용을 하고 있습니다. 한번에 처리 할 방법은 없을까요?

!등등 더 나은 앱을 만들기 위해서는

어떻게 해야 할까요?

(Advanced를 위한)

과제가 아닙니다!!

정답은 SW 아키텍쳐시간에…

Page 154: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

오늘의 정리

Page 155: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

이제 JSON형태의 데이터를 SQLite DB에 넣어보았습니다.

Page 156: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

DB의 데이터를 Adapter를 사용하여

리스트로 표현하였습니다.

Page 157: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

메인화면

글 읽기

리스트를 터치하면 그 게시물의 상세 정보를 볼 수 있습니다.

Page 158: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

DB에 관한 기본적인 내용은 아마도 끝?

Page 159: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

다음에 구현해야 할 내용

Page 160: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

네 트 워 크

Page 161: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

서버로부터 게시글의 정보를 json 형태로 불러오기

Page 162: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

메인화면

글 읽기

글쓰기 기능을 구현 (서버 업로드)

Page 163: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

다음주 수업 전까지 !

기존에 작업하신 웹서버와 연동을 하고 싶으신 분은 JSON방식으로 게시글 정보를 출력해주는 페이지와

!사진을 POST방식으로 업로드하면 파일을 저장하고 게시글 정보를 DB에 넣는 부분이 잘 작동하는지

미리 준비를 하시고 오셔야 합니다 : ) (업로드를 위해서는 어떤 인자들이 필요한지 등등)

!!

그래도 혹시 자신의 서버가 안돌아가도 테스트는 할 수 있도록 서버를 따로 준비해줄 예정을 하고는 있습니다…

Page 164: [NEXT] Android 개발 경험 프로젝트 3일차 (Database)

수고하셨습니다^^