6장 데이터 저장, 검색, 그리고 공유

안드로이드의 데이터 저장 기법은 속도 효율성, 그리고 견고함 간의 균형을 달리한 몇가지 옵션을 제공한다.

  1. File: 흔하게 사용하지 않지만 직접 파일을 쓰고, 읽어 데이터를 관리한다.

 2. Shared Preference
    - 파일로 관리되지만 키값을 이용한다. 기초 데이터를 관리한다.(데이터 각각을 저장)
    - Shared Preference는 Application 전역에서 data를 저장하거나 획득 할 수 있다.
    - getSharedPreference를 사용하여 데이터를 관리한다.
    - 데이터를 낱개로 저장하기 때문에 구조화 된 데이터를 이용하기에는 부족하다.

3. Bundle
   - Activity의 data 저장/복원 할 때 사용한다.
   - Activity의 라이프 사이클 동안에 호출되는 함수는 Bundle을 넘겨 받을 수 있다.

4. SQLite 
   - RDBMS 를 사용 할 수 있다. 기존 JDBC와 비슷하게 사용할 수 있다.
   - 모든 애플리케이션은 자신만의 DB를 생성할 수 있으며, 그에 대해 전적인 제어를 가진다.
   - SQLiteDatabase 객체를 이용해 프로그래밍 한다.
   - Cursor를 이용하여 데이터를 raw 단위로 핸들링 한다. 
[ SQLiteDatabase : exeSQL(sql), rawQuery(sql) 그외 insert, update, delete, query 등이 제공]
[ Cursor: moveToFirst(), moveToNext() ]

<예제> Shared Preference를 이용하여 데이터를 저장하고 불러오기

1. 매니페스트에서 Acitivity1을 추가하고 intent-filter는 그냥 main이 가진것을 복사하자.
2. Main에서 데이터를 저장한다.

2. Activity1에서는 Main에서 저장한 데이터를 읽어와 보자.

3. DB가 저장 정보를 확이하려면 DDMS에 File Explorer->Data 에서확인할 수 있다. 
   - 파일을 익스포트 하려면 오른쪽 구석에 버튼을 누르자.

   - SharedPreference로 저장된 데이터는 xml 임을 확인할 수 있다.

<예제> DB를 사용하여 데이터를 관리해보자.
이름과 주소를 입력 받아 DB에 저장하는 애플리케이션을 만들어 보자.
<주소록 입력 창>
< 주소록 >
1. 두개의 Activity를 MemberEdit 와 MemberList 를 만들고 Edit에서 List를 Intent하는 방식을 사용.
2. DBAdapter.java를 만들어 DB를 사용하는 class를 만들자.
3. Meberlist에서는 DB에서 데이터를 얻어와 보여주다.
소스:

* Content Provider
 - 애플리케이션 간에 데이터를 공유할 수 있도록 해주는 일반적인 인터페이스 메커니즘이다. 
 - content provider의 질의는 데이터 베이스 질의와 매유 유사한 형태를 띤다. 
 - 사용자는 ContentResolver를 이용하여 Data를 이용할 수 있다.
 - 네이티브 안드로이드의 Content Provider 를 이용하여 다음 정보들을 얻을 수 있다.
   (Browser, CallLog, Contacts, MediaStore, Settings)

8장 백그라운드에서 작업하기
- 서비스 소개
- 백그라운드 작업자 스레드 이용하기

Background 작업
컴퍼넌트 중에 주요 컴퍼넌트는 Activity와 Service 이다. Service는 Activity와는 달리 백그라운드에서 동작한다. 규칙적으로 무언가를 업데이트 하지만 사용자 상호작용이 거의 드물거나 간헐적으로 필요한 애플리케이션은 서비스로 구현하기 좋은 후보이다. 
- Service 라이프 사이클을 살펴보자.


- 서비스를 시작하기 위새서는 인텐트를 사용하여 startService를 호출하는 방법이 있다. startService가 호출이 되면 onCreate와 onStart가 호출이되고 필요하다면 thread 가 동작하도록 동작한다.
- 서비스를 중지 시킬때는 stopService를 호출하면 된다.
- 서비스가 시작이 된 후 startService를 다시 부르면 실글톤으로 동작하여 onStart 함수만 호출이 된다.
- Activity 등에서 서비스의 데이터를 사용하기 위해서는 서비스를 바인팅 시켜야 한다. 이때 bindService를 하면 된다. bindService가 호출이 되면 onCreate, onBind가 호출이된다.(p354)

- 이렇게 바인딩 된 서비스의 데이터를 사용하기 위해서는 ServiceConnection 타입의 객체를 만들어 주어야 한다. 이 객체는 서비스가 바인딩 되었을때 불리우는 함수이다. 서비스가 바인딩 되었을 때 onServiceConnected가 호출이 되며, 해지되었을 때는 onServiceDisconnected가 호출이 된다.
- 데이터를 사용하기 IBinder를 상속받아 onBinder에서 넘어오는 객체를 받아서 처리해 주어야 한다.

* 쓰레드 작업(p356)
- 안드로이드에서는 입력 이벤트에 대해서는 5초 이상의 작업을 진행 할 수 없다. 따라서 Thread를 생성하여 작업을 해주어야 한다. 하지만 두개의 thread 에 의해 view가 접근이 되면 에러를 발생 시킨다. 따라서 view에 접근하는 것은 하나의 UI thread를 생성하고 다른 thread는 이 UI thread를 통하여 업데이트를 진행한다.

<예제> MP3 플레이어를 만들어 봅시다~!!
< 서비스를 이용한 음악 플에이어>
1. 매니페스트에서 Application 탭에서 서비스를 추가하자. 이름은 PlayService로 한다.
2. res/raw 폴더를 추가 하고 mp3파일과 이미지 파일을 넣자.
3. layout의 main.xml에 버트 두개를 추가 한다.
   - id를 main_start와 main_stop으로 준다. 이미지는 raw/start, stop으로 설정.

2. 메인 코드
- start  버튼이 눌리면 인텐트를 통하여 서비스를 시작시키고, stop 버튼이 눌리면 인텐트를 통하여 서비스를 종료 시키도록 한다.

3. 서비스 코드
  - 서비스에서는 MediaPlayer 객체를 선언하고 카라 음악을 플레이하는 코드를 넣어 준다.  
소스:
<예제> 위 플에이어에 프로그레시브 바가 나오도록 해보자.

1. 쓰레드와 서비스를 이용한 프로그레시바 동작. 소스코드 참조.
소스:



Posted by 빨간 양말