Content Provider - Menggunakan Konstanta String Untuk Query yang Sudah Ditentukan

Selain menggunakan URI untuk query, kita juga bisa menggunakan daftar konstanta string untuk query yang sudah ditetapkan di Android untuk menentukan URI untuk tipe-tipe data yang berbeda. Contohnya, selain menggunakan query content://contacts/people, kita bisa menggunakan alternatif dengan mengganti kode berikut:
Uri allContacts = Uri.parse("content://contacts/people");
dengan menggunakan salah satu konstanta yang sudah ditetapkan di Android, seperti berikut ini:
Uri allContacts = ContactsContract.Contacts.CONTENT_URI;
Catatan:
untuk Android 2.0 dan setelahnya, untuk query pada record-record Contacts dasar kita perlu menggunakan URI: ContactsContract.Contacts.CONTENT_URI
Beberapa contoh konstanta string untuk query yang sudah ditetapkan antara lain:
  • Browser.BOOKMARKS_URI
  • Browser.SEARCHES_URI
  • CallLog.CONTENT_URI
  • MediaStore.Images.Media.INTERNAL_CONTENT_URI
  • MediaStore.Images.Media.EXTERNAL_CONTENT_URI
  • Settings.CONTENT_URI
Bila kita ingin mengambil contact pertama, kita menentukan ID dari contact tersebut, seperti berikut:
Uri allContacts = Uri.parse("content://contacts/people/1");
Alternatifnya, kita menggunakan konstanta yang sudah ditetapkan bersama dengan method 'withAppendedId()' dari class ContentUris' seperti berikut:
import android.content.ContentUris;
...
Uri allContacts = ContentUris.withAppendedId(
ContactsContract.Contacts.CONTENT_URI, 1);

Selain, membuat ikatan ke 'ListView', cara lain sebagai alternatif kita juga bisa mencetak hasilnya dengan menggunakan object 'Cursor', seperti ditunjukkan pada latihan di bawah ini:

1. File layout xml: activity_main.xml (sama dengan latihan sebelumnya)

2. File java: MainActivity.java (modifikasi dari file latihan sebelumnya dan perhatikan bagian yang ditulis dengan huruf tebal)
package com.example.provider; 
import android.app.ListActivity;
import android.content.CursorLoader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.util.Log;
import android.widget.CursorAdapter;
import android.widget.SimpleCursorAdapter;

public class MainActivity extends ListActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

Uri allContacts = ContactsContract.Contacts.CONTENT_URI;

Cursor c;
if (Build.VERSION.SDK_INT < 11) {
/*sebelum honeycomb*/
c = managedQuery(allContacts, null, null, null, null);
} else {
/*Honeycomb dan seseudahnya*/
CursorLoader cursorLoader = new CursorLoader(this,allContacts,null,null,null,null);
c = cursorLoader.loadInBackground();
}

String[] columns = new String[] {
ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts._ID};

int[] views = new int[] {R.id.contactName, R.id.contactID};

SimpleCursorAdapter adapter;

if (Build.VERSION.SDK_INT < 11) {
/*sebelum honeycomb*/
adapter = new SimpleCursorAdapter(this, R.layout.activity_main, c, columns, views);
} else {
/*honeycom dan setelahnya*/
adapter = new SimpleCursorAdapter(this, R.layout.activity_main, c, columns, views,
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
}
this.setListAdapter(adapter);
PrintContacts(c);
}

private void PrintContacts(Cursor c)
{
if (c.moveToFirst()) {
do {
String contactID = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
String contactDisplayName = c.getString(c.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
Log.v("Content Providers", contactID + ", " + contactDisplayName);

} while (c.moveToNext());
}
}

}

Setelah kita jalankan di emulator Android, method 'PrintContacts()' akan mencetak data berikut ini di bagian jendela Log:
V/Content Providers: 1, Evi
V/Content Providers: 2, Ega
V/Content Providers: 3, Dessy
Method tersebut akan mencetak ID dan nama dari setiap contact yang disimpan di app Contacts. Dalam hal ini, kita mengakses field ContactsContract.Contacts._ID untuk mendapatkan ID dari suatu contact dan ContactsContract.Contacts.DISPLAY_NAME untuk mendapatkan nama dari suatu contact. Bila kita ingin menampilkan nomor phone dari suatu contact, maka kita perlu query 'content provider' lagi, karena informasi tersebut disimpan di tabel yang berbeda (tambahkan method 'PrintContacts()' dengan kode berikut yang ditulis dengan huruf tebal):
private void PrintContacts(Cursor c)
{
if (c.moveToFirst()) {
do {
String contactID = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
String contactDisplayName = c.getString(c.getColumnIndex(
ContactsContract.Contacts.DISPLAY_NAME));
Log.v("Content Providers", contactID + ", " + contactDisplayName);

/*mengambil nomor telphone*/
int hasPhone = c.getInt(c.getColumnIndex(
ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (hasPhone == 1) {
Cursor phoneCursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " +
contactID, null, null);
while (phoneCursor.moveToNext()) {
Log.v("Content Providers", phoneCursor.getString(
phoneCursor.getColumnIndex(
ContactsContract.CommonDataKinds.Phone.NUMBER)));
}
phoneCursor.close();
}

} while (c.moveToNext());
}
}
Catatan:
Untuk mengakses nomor phone dari suatu contact, kita perlu melakukan query dengan URI yang disimpan pada ContactsContract.CommonDataKinds.Phone.CONTENT_URI.
Pada potongan kode di atas, kita terlebih dahulu melakukan cek apakah suatu contact memiliki nomor phone atau tidak dengan menggunakan field ContactsContract.Contacts.HAS_PHONE_NUMBER. Bila contact tersebut memiliki setidaknya satu nomor phone, maka kita melakukan query 'content provider' lagi berdasarkan ID dari contact tersebut. Setelah nomor phone diambil, kemudian kita melakukan iterasi pada semua nomor phone dan kemudian mencetaknya. 

Setelah kita jalankan di emulator Android, seharusnya bisa kita lihat di jendela log seperti berikut:
V/Content Providers: 1, Evi
V/Content Providers: 081286799031
V/Content Providers: 2, Ega
V/Content Providers: 081-2555
V/Content Providers: 3, Dessy
V/Content Providers: 081-8555

No comments: