콘텐츠 제공자 내의 데이터에 액세스하고자 하는 경우, 애플리케이션의 Context에 있는 ContentResolver 객체를 사용한다.
추가 자료: https://developer.android.com/guide/topics/providers/content-providers.html?hl=ko
제공자에 액세스하는 데 필요한 권한을 얻으려면 애플리케이션은 자신의 매니페스트 파일에 있는
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.kwanwoo.android.contentresolvertest">
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<application ...>
...
</application>
</manifest>
public class MainActivity extends AppCompatActivity {
final int REQUEST_CODE_READ_CONTACTS = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 권한 확인
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_CONTACTS)
!= PackageManager.PERMISSION_GRANTED) { // 권한이 없으므로, 사용자에게 권한 요청 다이얼로그 표시
ActivityCompat.requestPermissions(MainActivity.this,
new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_CODE_READ_CONTACTS);
} else // 권한 있음! 해당 데이터나 장치에 접근!
getContacts();
}
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_READ_CONTACTS) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getContacts();
} else {
Toast.makeText(getApplicationContext(), "READ_CONTACTS 접근 권한이 필요합니다", Toast.LENGTH_SHORT).show();
}
}
}
query 메소드 (ContentResolver 클래스 내)
Cursor query (Uri uri,
String[] projection,
String selectionClause,
String[] selectionArgs,
String sortOrder)
인수 | 설명 |
---|---|
uri | 콘텐츠 제공자의 URI. content:// 형식 |
projection | 반환해야 할 열들 |
selectionClause | 선택될 행들에 대한 조건 |
selectionArgs | 조건에 필요한 인수 |
sortOrder | 선택된 행들의 정렬 방법 |
콘텐츠 URI
형식
content://AUTHORITY/PATH/ID
예제
연락처 정보를 제공하는 제공자에 액세스하는 데 필요한 변수를 ContactsContract 계약 클래스에 정의된 상수를 이용하여 정의
String [] projection = {
ContactsContract.CommonDataKinds.Phone._ID,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
};
// 연락처 전화번호 타입에 따른 행 선택을 위한 선택 절
String selectionClause = ContactsContract.CommonDataKinds.Phone.TYPE + " = ? ";
// 전화번호 타입이 'MOBILE'인 것을 지정
String[] selectionArgs = {""+ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE};
설정된 파라미터를 바탕으로 query() 메소드를 실행
Cursor c = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, // 조회할 데이터 URI
projection, // 조회할 컬럼 들
selectionClause, // 선택될 행들에 대한 조건절
selectionArgs, // 조건절에 필요한 파라미터
null); // 정렬 안함
쿼리 결과인 Cursor 객체가 들어 있는 SimpleCursorAdapter 객체를 생성하며, 이 객체를 ListView에 대한 어댑터로 설정
ListView의 항목 뷰 정의 (item.xml)
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium"
android:textColor="@color/colorPrimaryDark"
android:layout_weight="1"/>
<TextView
android:id="@+id/phone"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorPrimaryDark"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_weight="1"/>
</LinearLayout>
SimpleCursorAdapter 설정
String[] contactsColumns = { // 쿼리결과인 Cursor 객체로부터 출력할 열들
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER
};
int[] contactsListItems = { // 열의 값을 출력할 뷰 ID (layout/item.xml 내)
R.id.name,
R.id.phone
};
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
R.layout.item,
c,
contactsColumns,
contactsListItems,
0);
ListView lv = (ListView) findViewById(R.id.listview);
lv.setAdapter(adapter);
ContentResolver의 아래 메소드를 사용
[주의] 모든 콘텐츠 제공자가 데이터 삽입,업데이트,삭제 기능을 제공하지는 않습니다. 필요에 따라서 이 기능들을 제공할 수도 있고, 안할 수도 있습니다.