[안드로이드 예제] ContentProvider 이용하기 :: 소림사의 홍반장!

Content Providers
 어플리케이션끼리 특정한 데이터를 주고 받을 수 있게 해주는 기술.(공용 데이터베이스)
 예를 들어 주소록이나 음악 앨범이나 플레이리스트 같은 것에도 접근하는 것이 가능하다.
 (1) ContentProvider 사용
  getContentResolver() 메소드로 ContentResovler를 얻을 수 있다.
  이 객체로부터 다음과 같은 각종 메소드를 실행하는 것이 가능하다.
  ① Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder)
   - uri : content://scheme 방식의 원하는 데이터를 가져오기 위한 uri
   - projection : 가져올 컬럼의 이름들 배열, null이면 모든 컬럼
   - selection : where 절에 해당하는 내용 ("where" 는 생략)
   - selectionArgs : 위의 selection에서 ?로 표시한 곳에 들어갈 데이터 배열
   - sortOrder : order by 절의 내용이 들어간다 ("order by"는 생략)
  ② Uri insert(Uri url, ContentValues values)
   - url : 값을 인서트할 테이블의 URL값
   - values : 새롭게 인서트할 값의 클래스 객체 (ContentValues 클래스의 put 메소드를 이용해 추가가능)
  ③ int bulkInsert(Uri url, ContentValues[] values) : 여러 행을 한꺼번에 인서트할때 사용
  ④ int update(Uri uri, ContentValues values, String where, String[] selectionArgs) : update시 사용
  ⑤ int delete(Uri url, String where, String[] selectionArgs) : delete시 사용
 (2) ContentProvider 작성
  <1> ContentProvider 클래스를 상속받아서 다음과 같은 메소드를 오버라이드 해야한다.
   ① query()
   ② insert()
   ③ update()
   ④ delete()
   ⑤ getType()
   ⑥ onCreate()
  <2> MIME type 지정
   완전히 새로운 타입의 경우 getType 메소드를 통해서 URI 가 일치할 경우 해당 MIME Type 을 리턴해준다.
   MIME Type은 일반적으로 다음과 같이 선언한다.
   - 단일 데이터일 경우
   vnd.android.cursor.item/vnd.yourcompanyname.contenttype
   - 복수행 데이터일 경우
   vnd.android.cursor.dir/vnd.yourcompanyname.contenttype
  <3> Content의 URI 작성
   content://authority/path/_id 형태로 작성이 가능하다. 이 URI로써 특정 데이터에 접근하는 것이 가능해진다.

 

사용 예제

AndroidMenifest.xml에

  <uses-permission android:name="android.permission.READ_CONTACTS"/>    추가 필요!

 

 

package com.example.cpapp;

 

import java.util.*;

 

import android.os.Bundle;

import android.provider.*;

import android.app.Activity;

import android.database.*;

import android.view.*;

import android.widget.*;

 

public class MainActivity extends Activity {

     

      private ArrayList<Map<String,String>> dataList;

 

      private ListView listview;

 

      @Override

      protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            listview = (ListView) findViewById(R.id.listview);

           

      }

 

      @Override

      public boolean onCreateOptionsMenu(Menu menu) {

            // Inflate the menu; this adds items to the action bar if it is present.

            getMenuInflater().inflate(R.menu.activity_main, menu);

            return true;

      }

     

      public void mOnClick(View v) {

            switch(v.getId()) {

            case R.id.bt_addr:

                  /*

                    - uri : content://scheme 방식의 원하는 데이터를 가져오기 위한 uri

                    - projection : 가져올 컬럼의 이름들 배열, null이면 모든 컬럼

                    - selection : where 절에 해당하는 내용 ("where" 는 생략)

                    - selectionArgs : 위의 selection에서 ?로 표시한 곳에 들어갈 데이터 배열

                    - sortOrder : order by 절의 내용이 들어간다 ("order by"는 생략)

                   */

                  dataList = new ArrayList<Map<String,String>>();

                  Cursor c = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,

                             null, null, null,

                             ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " asc");

                 

                  // ContactsContract.Contacts 안에는 전화번호가 없다.

                  // Contacts 안에 개인정보가 보관되어 있다.

                  while(c.moveToNext()) {

                        HashMap<String, String> map = new HashMap<String, String>();

                       

                        String id = c.getString(   // 개인의 id

                                   c.getColumnIndex(ContactsContract.Contacts._ID));

                       

                        String name = c.getString( // 개인 대표 이름

                                   c.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));

                        map.put("name", name);

                       

                        // ID로 전화에 대한 정보를 가지고 있는 cursor 가져오기

                        Cursor phoneCursor = getContentResolver().query(

                                   ContactsContract.CommonDataKinds.Phone.CONTENT_URI,

                                   null,

                                   ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + id,

                                   null, null);

                       

                        // 데이터가 있으면

                        if(phoneCursor.moveToFirst()) {

                             String number = phoneCursor.getString(phoneCursor.getColumnIndex(

                                         ContactsContract.CommonDataKinds.Phone.NUMBER));

                             map.put("phone", number);

                        }

                        phoneCursor.close();

                       

//                     // ID로 이메일에 대한 정보를 가지고 있는 cursor 가져오기

//                     Cursor emailCursor = getContentResolver().query(

//                                 ContactsContract.CommonDataKinds.Email.CONTENT_URI,

//                                 null,

//                                 ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + id,

//                                 null, null);

//                    

//                     // 데이터가 있으면

//                     if(emailCursor.moveToFirst()) {

//                           String email = phoneCursor.getString(phoneCursor.getColumnIndex(

//                                       ContactsContract.CommonDataKinds.Email.ADDRESS));

//                           map.put("email", email);

//                     }

//                     emailCursor.close();

                        dataList.add(map);

                       

                  }// end while

                  c.close();

                 

                  SimpleAdapter adapter = new SimpleAdapter(getApplicationContext(),

                             dataList,

                             android.R.layout.simple_list_item_2,

                             new String[]{"name","phone"},

                             new int[]{android.R.id.text1,android.R.id.text2});

                  listview.setAdapter(adapter);

            }

      }

 

}

 

 

 

다른 카테고리의 글 목록

Dev. 안드로이드/참고소스 카테고리의 포스트를 톺아봅니다