26. SERVER
Main
2)서버로 부터JSON으로 데이터 받음
1)데이터 요청
Proxy
ProxyUP
3)서버로부터 받은 데이터를 전달
Dao
4)JSON 데이터를 Dao에 전달
5)JSON 데이터를 파싱하여
SQLite에 insert하기
27. SERVER
Main
2)서버로 부터JSON으로 데이터 받음
1)데이터 요청
Proxy
ProxyUP
3)서버로부터 받은 데이터를 전달
Dao
4)JSON 데이터를 Dao에 전달
5)JSON 데이터를 파싱하여
SQLite에 insert하기
6)Dao에 저장되어 있는 게시글 데이터를 가져오기
28. SERVER
Main
2)서버로 부터JSON으로 데이터 받음
1)데이터 요청
Proxy
ProxyUP
3)서버로부터 받은 데이터를 전달
Dao
4)JSON 데이터를 Dao에 전달
7)Dao로 부터 가져온
데이터를 리스트에 표시
5)JSON 데이터를 파싱하여
SQLite에 insert하기
6)Dao에 저장되어 있는 게시글 데이터를 가져오기
31. SERVER
Main
10)post방식으로 서버에 사진 전송
Proxy
8)글 입력 창으로 이동
ProxyUP
ArticleWrite
9)글 제목,내용, 사진 경로등을 전달
Dao
7)Dao로 부터 가져온
데이터를 리스트에 표시
32.
33. Q) 불필요한 구조가 많은것 같은데?
!
A) Main에서 Proxy로 갔다 다시 메인으로 와서
Dao로 갔다가 또 Main으로 돌아 오는 등 불필요한 부분이 있습니다.
!
이것은 절차지향적인 설계로 보다 쉽게!? 학습을 위해서 입니다.
Advanced를 목표로 하는 학생은 독자적으로 설계를 해서
구현을 하셔도 무방합니다.
37. Main
DAO (Data Access Objects) 클래스
Dao라는 클래스를 만들어
데이터를 저장하고 불러오는 과정을
먼저 구현해 보겠습니다.
SQLite 데이터베이스를 관리하는 클래스
Dao
4)JSON 데이터를 Dao에 전달
5)JSON 데이터를 파싱하여
SQLite에 insert하기
6)Dao에 저장되어 있는 게시글 데이터를 가져오기
38. Dao
5)JSON 데이터를 파싱하여
SQLite에 insert하기
Q) DB를 왜 사용하나요?
!
A) 안드로이드 자체의 DB를 사용함으로써
네트워크가 불안정한 상태에서도 게시글의 내용을
화면에 표시를 하는 것이 가능합니다.
!
특히 해외는 이제서야 3G가 보급되기 시작되고
불안정한 곳도 많기 때문에 꼭 네트워크가 불안정한 상태를 가정하고
설계를 해야합니다.
!
그 외에도 앱 실행 후 빠르게 게시글 내용이 보이는등
여러 장점이 있습니다.
40. SQLite란?
SQLite는 MySQL같은 데이터베이스 관리 시스템으로
!
서버가 아니라 응용 프로그램에 넣어 사용하는
비교적 가벼운 데이터베이스로
대규모 작업에는 적합하지 않지만, 중소 규모라면 속도에 손색이 없다.
!
또 API는 단순히 라이브러리를 호출하는 것만 있으며
데이터를 저장하는 데 하나의 파일만을 사용한다.
!
안드로이드에는 기본 탑재되어 있어 손쉽게 이용이 가능하다.
41. SQLite란(2)?
SQLiteDB는 파일하나로 구성되어 있으며
쉽게 DB통째로 복사 및 이동이 가능합니다.
!
이번예제에서 사용하는 방법은
/data/data/package_name/databases/DB이름.db
에 저장이 됩니다.
!
따로 WRITE_EXTERNAL_STORAGE 권한이 필요없으나
루팅이 안되어 있는 디바이스에서는 data폴더에 접근을 하지 못합니다.
!
SQLite파일을 보고 싶으시면 DDMS나 루팅이 되어있는 디바이스,
AVD(Genymotion)상에서 확인이 가능 합니다.
42. SQLite DB 생성하기
SQLite에서는 데이터를 넣기 위해서는
Table생성보다 먼저 데이터 베이스를 먼저 생성을 해야 합니다.
SqLiteDatabase를 import한 다음 openOrCreateDatabase를
사용하여 DB파일을 생성거나 DB파일을 읽어줍니다.
54. TRY CATCH!
중복으로 테이블을 생성한다던지
유니크인 칼럼에 중복데이터를 넣는다던지 등등
!
try catch문으로 오류가 발생하여도
문제가 없도록 예외처리를 해서
앱이 멈추지 않고 계속 진행하도록 합니다.
55. 테이블 중복 확인을 위한 쿼리로 보호
테이블을 중복 생성을 하려고 하면 오류가 발생합니다.
CREATE TABLE하기 전에 테이블이 중복이 있는지 확인하는
쿼리를 날리던지
56. 아니면
create table if not exists 등으로 쿼리를 잘 짜야하던지 등등
!
여러 상황이 있을 수 있고 여러 해결 방법이 있지만
그래도 Try Catch는 생활화 합시다.
57. 안드로이드에서 DB를 사용할 때에는
일반적인 SQL문을 직접 작성해서 질의를 할 수 있지만
안드로이드 API를 사용할 수도 있습니다.
!
sql문을 입력하는 것과 차이는 없지만 api를 사용하면
컬럼명이나 기타 변경점에 유연하게 대응할 수 있습니다.
!
학습 진행에 여유가 있으신 분은
http://developer.android.com/training/basics/data-storage/databases.html
을 참고해 주세요
60. Main
Dao클래스를 만들고
DB에 JSON데이터를 저장하는
방법을 배워봅니다.
DAO (Data Access Objects) 클래스
SQLite 데이터베이스를 관리하는 클래스
Dao
4)JSON 데이터를 Dao에 전달
5)JSON 데이터를 파싱하여
SQLite에 insert하기
6)Dao에 저장되어 있는 게시글 데이터를 가져오기
67. 이 예제에서는 다음과 같은 테이블을 사용합니다.
ID - primary key값
ArticleNumber - 게시글 번호 중복X
Title - 글제목
WriterName - 작성자
WriterID - 작성자ID
Content - 글내용
WriteDate - 작성일
ImgName - 사진 파일명 중복X
테이블을 짜실 때에는 기존의 웹기반 게시판에서 보내주는
JSON형태의 데이터를 사용하시면됩니다.
132. profData → articleData
TextView tvName → tvTitle
TextView tvVillage → tvContent
변수명도 상황에 맞게 바꾸어 줍시다.
(eclipse의 Refactor-Rename을 사용하면 편합니다.)
혹 TextView의 ID가 달라졌으면 새 레이아웃에 맞게 ID도 바꾸어 주세요
146. Intent에서 데이터를 다른 Activity로 전달을 할 때
String이 아닌 Article객체를 통채로 넘겨줄수도 있지만
객체를 넘기기위해서는 Parcelable(자바의 Serialization과 유사)을
사용해야 하는데 이 예제에서 다루기에는 복잡하므로
!
!
Advanced를 목표로 하는 분만 Parcelable에 대해
학습을 해봐 주세요^^;
http://developer.android.com/reference/android/os/Parcelable.html
160. 데이터가
잘 표시되고 있습니다^^
기기 해상도에 따라 이미지가 너무
크거나 작게 보일 수 있습니다.
!
그림의 픽셀은 일정한데
해상도에 맞게 그림의 크기가
변화되지 못해서입니다.
!
이 문제점도
Advanced를 노리는 분은
Bitmap Resizing을 참고해주세요!
161. (Advanced를 위한)
생각해 봅시다.
Dao로부터 ArrayList로 Article들을 가져오는데
리스트는 사진, 글제목, 글내용밖에 없는데
Article의 내용을 다 가져오고 있습니다. 다른 방법은 없을까요?
!
동일한 함수를 반복해서 사용을 하고 있습니다.
한번에 처리 할 방법은 없을까요?
!
등등 더 나은 앱을 만들기 위해서는
어떻게 해야 할까요?
과제가 아닙니다!!
정답은 SW 아키텍쳐시간에…
171. 다음주 수업 전까지
!
기존에 작업하신 웹서버와 연동을 하고 싶으신 분은
JSON방식으로 게시글 정보를 출력해주는 페이지와
!
사진을 POST방식으로 업로드하면 파일을 저장하고
게시글 정보를 DB에 넣는 부분이 잘 작동하는지
미리 준비를 하시고 오셔야 합니다 : )
(업로드를 위해서는 어떤 인자들이 필요한지 등등)
!
!
그래도 혹시 자신의 서버가 안돌아가도 테스트는 할 수 있도록
서버를 따로 준비해줄 예정을 하고는 있습니다…