본문 바로가기

Programming Practice/Android

[Contacts Provider]연락처 입력 방법

1. 기본
ContentProvider 의 동작을 정의하는 ContentProviderOperation 객체와 ContentResolver 의 applyBatch method 를 사용하는 것이 기본.


2. Content Provider 의 operation 설정 로직

 * A content provider manages access to a central repository of data. 

 * 기본적으로 Contacts 와 Calendar 의 data 에 접근이 가능하다.

* ContentProviderOperation 은 ContentProvider 에 수행할 특정 operation(ex. insert, update, delete) 를 정의할 때 사용하는 객체이다.

1) ContentProviderOperation 을 담는 ArrayList 를 만든다.

2) 각각의 ContentProviderOperation 을 정의한다.

    - Data table 에 입력하는 ContentProviderOperation 의 경우, RAW_CONTACT_ID 에 Raw Contact 의 id를 넣어야 한다. 그러나 Raw Contact 에 데이터가 들어갈 예정일 뿐, 아직 들어간 게 아니므로, id를 조회해서 넣을 수 없다. 이때 .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 을 사용한다. 이때 '0' 의 의미는 '앞의 operation 이 성공한다면', 이란 의미이다.

    - 이때, 한 사람의 연락처 입력과 관련된 ContentProviderOperation 의 마지막 ContentProviderOperation 에서 YieldPoint 를 지정한다.

 ContentResolver 가 실제로 Contacts 의 여러 테이블에 데이터를 반영하는 applyBatch 를 수행할 때, 다른 process 들은 모두 block 되고, ContentResolver는 모든 ContentProviderOperation 이 끝난 후에 transaction을 수행한다. 

입력하는 데이터가 많을 경우, 수행되는 동안 모든 process 들이 block 되기 때문에, 사용자들에게 불편을 줄 수 있다. 

따라서 하나의 applyBatch 내에서 yieldPoint를 여러개 주게 되면, applyBatch 수행 도중 YieldPoint 를 만날 때마다, 다른 process 를 run 시키고, transaction을 수행한다. 

따라서 related rows 입력이 끝날 때마다 Yield Point를 지정해주는 것이 좋다. 

3) ContentProviderOperation 을 build 해서 ArrayList에 담는다.

<<sample source>>


3. ContentResolver 의 applyBatch 수행

<<sample source>>


참고)

1. Content Provider Basics