본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] contacts provider 의 기본 정보들. ( 기본 구조 )

by 돼지왕 왕돼지 2012. 11. 2.
반응형





contacts provider 의 기본 정보들. ( 기본 구조 )

- Contacts Provider 는 강력하고 유연한 안드로이드 컴포넌트로 연락처에 대한 자료를 관리하는 중앙 저장소이다. 당신도 이 연락처 저장소에 접근할 수 있고, online service 와 자료교환할 수도 있다. Contacts provider 는 연락처에 대한 가능한한 많은 정보를 담으려고 했기 때문에, query 결과는 매우 복잡할 수 있다. 그래서 많은 class 와 interface 들이 지원된다. 이것들을 잘 파악해야 연락처 정보를 가져다 쓰기도, 그리고 수정하기도 쉽다.


- 이 글은 다음과 같은 것들을 다룬다.

* 기본 provider 구조
 

* provider 로부터 어떻게 자료를 가져오는가?
 

* 어떻게 provider 의 자료를 수정하는가?
 

* server 와 자료를 sync 하기 위해 sync adapter 를 어떻게 사용해야 하는가?

 

- 이 글은 안드로이드의 content provider 에 대해 기본적인 이해가 있다고 가정한다. 


Contacts Provider Organization

- Contacts Provider 는 크게 3개로 나눌 수 있으며, 각각 한 table 씩과 연결된다.

- 3개의 table 은 contract class 를 통해 접근 가능하며, 각각의 contract class 들은 content URIs, column names, column values 등이 정의되어 있다.


- ContactsContract.Contacts table

  : 한 개의 row는 각각 다른 사람을 가르킨다. 여러개의 contact rows 가 사람기준으로 합쳐져 있는 형태이다.
 

- ContractsContract.RawContracts table

  : 한 개의 row 는 사람들의 자료에 대한 요약본이 들어 있다. user account 와 type 에 집중되어 있다.
 

- ContactsContract.Data table

  : 한 개의 row 는 raw contact 에 대한 자세한 정보들을 담고 있다. 예를 들면 email 주소나 전화번호들.


- ContactsContract 클래스의 다른 sub class 들은 보조적인 table 로 단말에 있는 연락처에 대한 특정 정보들을 다룬다. 자세한 것은 추후 설명된다.




Raw contracts

- raw contact 는 한개의 account type 과 account name 을 기준으로 자료를 가지고 있다. Contacts Provider 는 한 사람의 정보를 여러 online service 에서 사용할 수 있기 때문에 한 사람에 대해 여러개의 raw contacts 정보를 가질 수 있습니다. 여러개의 raw contacts 는 한 사람의 user 에 연결될 수 있으며, 한 사람이 여러개의 계정을 가진다는 의미로 보면 된다.


- 대부분의 raw data 는 ContactsContract.RawContracts table 에 저장되어 있지 않다. 대신에 ContactsContract.Data 테이블에 들어있다. 각각의 row 는 Data.RAW_CONTACT_ID 라는 column 을 갖는데 이는 ContactsContract.RawContracts._ID 값과 매칭된다.


Important raw contact columns

- raw contact column 중 중요한 정보는 ACCOUNT_NAME, ACCOUNT_TYPE, DELETED 이다.


- ACCOUNT_NAME 은 account type 에 대한 account name으로 raw contact 의 source 가 된다. 예를 들어 Google account의 account name 은 단말 주인의 Gmail address 가 될 수 있다. ACCOUNT_NAME 은 account type 에 매우 의존적이다. 꼭 email 주소일 필요도 없다.
 

- ACCOUNT_TYPE 은 이 raw contact의 소스이다. 예를 들어 Google account 의 type 은 "com.google" 이다. 항상 당신의 account type 은 당신이 가지고 있는 domain identifier 가 들어간다. 이것이 당신의 account type 이 유일하다는 것을 나타낸다. 보통 한 account type 은 그에 연관된 sync adapter 를 가지고 있어 Contacts Provider 를 sync 시킨다.
 

- DELETED 는 raw contact 의 삭제여부를 나타내는 flag 이다. 이 flag 는 Contacts Provider 가 해당 row 를 sync adapter 가 해당 서버에 연결하여 서버 저장소의 연락처를 지울때까지 내부적으로 자료를 유지한다.


 

Notes

- raw contact 의 이름은 ContactsContract.RawContacts 에 저장되어 있지 않다 대신에 ContactsContract.Data table과 ContrctsContract.CommonDataKinds.StructuredName row 에 저장되어 있다. 한개의 raw contact는 ContactsContract.Data table 에 있는 한 개의 type 과 매핑된다.
 

- 주의 : 당신의 계정에 대한 raw contact row 를 사용하기 위해서, 이 계정 정보가 AccountManager 에 반드시 등록되어 있어야 한다. 이를 위해서 user 에게 account type, account name 을 AccountManager 에 추가하도록 창을 띄워 알려야 한다. 만약 이 과정이 없다면 Contacts Provider 가 자동으로 당신의 이 raw contact row 를 삭제할 것이다. 

 예를 들어 당신이 com.example.dataservice 라는 웹 기반의 domain 서버와 contact 정보를 sync 하고 싶고, 사용자의 계정이 becky.sharp@dataservice.example.com 라면, 유저는 반드시 raw contact rows 에 접근하기 전에 account type 은 com.example.dataservice 로, account name 은 becky.sharp@dataservice.example.com 으로 등록해야 한다. 앱 개발자는 이를 유저에게 반드시 문서화해서 알리거나, prompt 를 띄워서 유저가 type 과 name 등을 입력하도록 유도해야 한다.


 

Sources of raw contacts data

- raw contacts 가 어떻게 작동하는지 이해하기 위해서 "Emily Dickinson" 이라는 사용자가 다음과 같은 3개의 계정을 가지고 있다고 가정해보자.

 * emily.dickinson@gamil.com

 * emilyd@gmail.com

 * twitter account "belle_of_amherst"

- 이 유저는 이 3개의 계정에 대해 Accounts settings 를 통해 sync 를 진행할 수 있다.

- 만약 Emily Dickinson이 브라우저를 통해 Gmail 에 로그인 해서 Contacts 를 open 한 다음에 "Thomas Higginson" 을 추가했다고 가정해보자. 다음에 다시 emilyd@gmail.com 이란 계정으로 로그인해서 "Thomas Higgison" 에게 이메일을 쓴다면 이 때 자동으로 그가 단말의 contact 에 저장이 된다. 이 때 자동으로 Thomas Higginson의 Twitter ID 인 colonel_tom 도 follow 가 된다.


1. Thomas Higginson 은 emily.dickinson@gmail.com 과 연결이 된다. account type 은 Google 이다.

2. 두번째로 Thomas Higginson 이 emilyd@gmailcom 과 연결된다. account type 은 마찬가지로 Google 이다. 이 때 다른 user account 에 같은 contact 정보가 연결되면서 총 2개의 raw contact 정보가 생긴다.

3. 새번째 raw contact 는 belle_of_amherst 와 연결된다. account type 은 twitter 이다.





Data

- 앞서 언급되었듯이 raw contact 정보는 ContactsContract.Data 에 저장되어 있다. 그리고 이들은 raw contacts 의 _ID 값을 foreign key 로 연결되어 있다. 그래서 한개의 raw contact 정보는 여러개의 data 와 연결될 수 있다. 여러개의 data 는 email 주소, 전화번호 등이다. 

- 다른 타입의 데이타들이 한 개의 table 에 저장되어 있다는 사실에 주의하자. Display name, phone number, email, postal address, photo, web site detail 정보 등이 모두 ContactsContract.Data table 에 저장되어 있다. ContactsContract.Data table 에는 묘사적인 이름과, generic 이름들을 가진 column 들을 가지고 있다. 


Descriptive column names

- RAW_CONTACT_ID : raw contact 의 _ID 와의 foriegn key.
 

- MIMETYPE : 해당 row 에 저장된 데이터의 종류. MIME type 은 ContactsContract.CommonDataKinds 의 subclass 들에 정의되어 있다.
 

- IS_PRIMARY : 특정 type 의 data 가 여러개가 있다면 IS_PRIMARY column 의 primary data 에 대한 flag 가 된다. 유저는 여러개의 phone number 가 있을 때 연락처에서 한 전화번호를 long-press 해서 "Set default" 라는 action 을 할 수 있는데, 이렇게 선택된 전화번호가 primary data 가 된다. primary 정보의 경우 IS_PRIMARY column 이 0이 아닌 값이 assign 된다.


 

Generic column names

- DATA1 ~ DATA15 까지 15가지의 generic column 이 있다. 그리고 추가적으로 SYNC1 ~ SYNC4 까지의 추가 generic column 이 있다. SYNC1 ~ SYNC4 까지는 sync adapters 에 의해 사용된다. 

- DATA1 column 은 가장 많이 쓰이는 것으로 해당 MIME_TYPE 에 대한 key 값이 들어있다. 해당 row 가 email 을 가르키는 row 라면 DATA1 이 email 주소값을 가지고 있다. 일반적으로 DATA15는 Binary Large Object(BLOB) 값을 저장하게 되어 있다. 예를 들어 photo thumbnails.


 

Type-specific column names

- ContactsContract.CommonDataKinds subclass 들에는 column name 들이 정의되어 있다. 같은 constant 이름이라도 Class에 따라 다른 value 값이 assign 되어 있다. 예를 들어 CommonDataKinds.Email.Address 는 ContactsContract.Data.DATA1 이 매핑된다.

 


 

Type-specific column name classes

- 자주 쓰이는 type-specific column name class

* StructuredName : 이름정보
 

* Photo : 사진정보
 

* Email : 이메일 정보
 

* StructuredPostal : Postal 주소
 

* GroupMembership : 그룹정보



도움이 되셨다면 손가락 꾸욱~ ( 로그인 필요 x )



반응형

댓글