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. 안드로이드 > 참고소스' 카테고리의 다른 글
실시간 데이터 ListView 구현 (2) | 2013.01.08 |
---|---|
[안드로이드 예제] 그림을 그려서 저장해보자 phoroshop 예제 소스 (12) | 2012.11.29 |
[안드로이드 예제] Service & Notification(알림바띄우기) 이용하기 (2) | 2012.11.29 |
[안드로이드 예제] BroadcastReceiver 이용하기 (3) | 2012.10.26 |
[안드로이드 예제] AsyncTask 이용하기 (2) | 2012.10.23 |