본문 바로가기

Study/Programming

안드로이드 콘텐트 제공자 - 꼬로미

홧팅2홧팅2


안녕하세요 꼬로미입니다


안드로이드 프로그래밍 콘텐트 제공자에 대한 포스팅입니다






콘텐트 제공자(content provider)

                                                                                                  



애플리케이션에 데이터를 공급하는 역할을 하는 컴포넌트가 콘텐트 제공자로 안드로이드에서 애플리케이션간 데이터를 공유하는 대표적인 수단이며 데이터 공급을 추상화하여 데이터 계층과 애플리케이션 계층을 분리하는 역할

안드로이드 장치안의 전화기록, 연락처 등 공유데이터들은 android.provider 패키지에 콘텐트 제공자가 나열되있음

사용자들은 이 콘텐트 제공자가 가진 데이터를 요청해 사용 가능


중요성있는 콘텐트 제공자 & 설명

Browser : 북마크, 웹검색 기록 등 제공

CallLog : 부재중 전화, 착신 기록, 발신 기록 등 제공

Contacts : 연락처 기록 제공

MediaStore : 오디오, 비디오, 이미지 등의 멀티미디어 데이터를 제공

Setting : 장치의 환경 설정 데이터를 제공

UserDictionary : 자동 입력에 사용되는 사용자가 정의한 사전을 제공






콘텐트 제공자의 기본

                                                                                                  



관계 데이터베이스의 테이블형태로 데이터를 외부 애플리케이션에 제공합니다


각 행(row)은 하나의 레코드이며 컬럼(column)은 필드의 형식을 가집니다


콘텐트 제공자 접근

  • ContentResolver 객체로 원하는 콘텐트 제공자를 찾음
    (액티비티에서 getContentResolver()를 호출해 얻음)

  • ContentResolver 객체와 ContentProvider 객체는 서로 다른 애플리케이션에서 실행됨
    ( 프로세스간 통신으로 데이터를 주고받음)


콘텐트 URI (Uniform Resource Identifier)

콘텐트 제공자 안에서 테이블을 가르키는 URI를 콘텐트 URI라고 합니다

문자열을 사용해 텍스트, 비디오, 사운드 클립, 정지화상 등과 같은 콘텐트를 식별하는 규격입니다


  content://kr.co.company.bookprovider/books/123 

content:// : 콘텐트 제공자를 의미하는 접두사, 스키마

kr.co.company.bookprovider : 콘텐트 제공자의 이름(ID)

books : 콘텐트가 위치하는 경로를 적어줌

123 : 콘텐트의 이름(ID), 개별항목을 뜻함

* URI는 서버에서도 가능하지만 로컬에서 또한 가능합니다


데이터 요청시 URI 문자열을 Uri객체로 변환하여 사용

 Uri uri = Uri.parse ("content://kr.co.company.bookprovider/books" );


안드로이드에 내장되어 있는 제공자들은 Uri 객체를 상수로 제공

UserDictionary.Words.CONTENT_URI 





콘텐트 제공자로부터 데이터 읽기

                                                                                                  

  1. 컨텐트 제공자를 읽을 수 있는 권한을 매니페스트 파일에 표시
  2. 쿼리를 작성해 실행
  3. 쿼리 결과로 반환된 레코드들을 커서 객체를 통해 순회하면서 원하는 작업을 가짐

권한 표시

 <uses-permission android:name="android.permission.READ_USER_DICTIONARY">



쿼리 작성

요소 5개를 사용하며 SQL SELECT 문장과 아주 유사

Projection : 레코드에 포함되는 필드의 이름

Selection : SQL의 WHERE에 해당

SortOrder : 반환되는 레코드들의 정렬 순서



쿼리 결과 처리

추출 데이터는 커서객체를 통해 반환, 커서객체로 레코드를 순회하며 데이터 읽기가 가능

int index = mCursor.getColumnIndex(UserDictionary.Wokrds.WORD);

if(mCursor !=null) {

while(mCursor.moveToNext()) {

newWord = mCursor.getString(index);

...

int index = mCursor.getColumnIndex(UserDictionary.Wokrds.WORD); : 컬럼명 WORD의 인덱스를 얻음

mCursor.moveToNext : 커서에서 다음행으로 이동, 행 포인터 초기값은 -1

newWord = mCursor.getString(index); : 컬럼인덱스를 가지고 컬럼 값을 구함

* 자료형에 따라 커서객체의 메소드를 알아야하기에 필드의 자료형을 알고 있어야함
* getString(), getInt() 등 읽을 자료형에 따라 호출



커서 어댑터 이용

커서객체가 행들의 리스트이므로 SimpleCursorAdapter를 통해 ListView를 사용이 가능

(query()가 반환하는 커서객체를 받아 SimpleCursorAdapter 생성 후 ListView를 위한 어댑터로 연결)





콘텐트 제공자를 이용해 데이터 변경

                                                                                                  



ContentResolver()의 메소드 호출로 컨텐트 제공자의 메소드를 호출해 데이터 변경이 가능하며

데이터를 읽고 쓰기위해서는 권한도 설정되어 있어야합니다


이터 추가

Uri 객체 생성

새로운 값들을 저장할 ContentValue 생성

ContentValues.put()으로 각 컬럼에 대한 값 설정, 입력

getContentResolver.insert()으로 데이터를 추가


데이터 업데이트

ContentValues 객체에 새로운 값을 채우고 ContentResolver.update() 호출


데이터 삭제

삭제할 행 조건을 Selection에 지정후 delete() 호출

ContentResolver.delete();






콘텐트 제공자에 저정가능한 데이터 타입

                                                                                                  



integer

long integer (long)

floating point

long floating point (double)

BLOB(binary Large Object)


이진 데이터 저장

테이블에 이진 데이터 추가시 바이트 배열을 인수로 put()을 호출

대용량의 이젠 데이터 추가시 content://... 형태의 URI를 테이블에 데이터로 저장

URI를 인수로 ContentResolver.openOutputStream() 호출 후 파일 저장

URI를 이용해 이진 데이터에 대한 메타 데이터도 ContentResolver.openInputStream()을 호출해 얻을 수 있음






콘텐트 제공자 작성

                                                                                                  



컨텐트 제공자 작성 여부

  • 다른 애필르케이션에 데이터나 파일을 제공하고 싶을 때

  • 사용자가 내 애플리케이션에서 다른 애플리케이션으로 데이터를 복사하게 하고 싶을때

  • 탐색 프레임워크를 사용해 맞춤형 탐색 조언을 제공하고 싶을 시


컨텐트 제공자 작성 절차

  1. 데이터를 어떤 방식으로 저장할지 결정 (대부분 파일이나 SQLitefmf dldydgo wjwkd)

  2. ContentProvider 클래스를 상속받은 클래스 작성 ( 데이터와 외부사이 인터페이스 역할)

  3. 콘텐트 제공자 이름, URI, 컬럼 이름 정의 + 인텐트, 권한 등 상수로 정의

  4. 애플리케이션 매니페스트 파일에 콘텐트 제공자 선언

  5. + 콘텐트 제공자, 클라우드기반 데이터사이에 데이터 동기화가 가능한 AbstractThreadedSuncAdapter 구현가능


컨텐트 제공자 구조

ContentProvider 상속 클래스 정의 {

      ContentProvider의 추상 메소드 구현

oncreate()

query()

insert()

delete()

update()

String getType()

}

onCreate() 제외 메소드는 여러 스레드부터 동시 호출될 수 있기에 멀티 스레딩에 대해 안전한 방법으로 구현

onCreate()에서는 간단한 작업만 해야함

반환값을 반환하는 것이 가장 간단한 구현




고고고고

읽어주셔서 감사드리며

뷰업 한번 부탁드려요~