Menggunakan Content Provider Yang Sudah Dibuat

Pada contoh latihan sebelumnya (Membuat Content Provider Sendiri), kita sudah membuat 'content provider' sendiri dan kita bisa mencobanya menggunakannya dalam app Android. Berikut di bawah ini adalah contoh latihan menggunakan/memanfaatkan 'content provider' yang sudah kita buat dan meneruskan dan masih berada di dalam satu project yang sama dengan contoh sebelumnya (Membuat Content Provider Sendiri):

1. File 'activity_main.xml' :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:orientation="vertical"
tools:context="com.example.contentprovider.MainActivity">

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ISBN" />

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/txtISBN"/>

<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Title"/>

<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/txtTitle"/>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Add title"
android:id="@+id/btnAdd"
android:onClick="onClickAddTitle"/>

<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Retrieve titles"
android:id="@+id/btnRetrieve"
android:onClick="onClickRetrieveTitles"/>
</LinearLayout>
2. File MainActivity.java:
package com.example.contentprovider;

import android.content.ContentValues;
import android.content.CursorLoader;
import android.database.Cursor;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

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

public void onClickAddTitle(View view) {
/* -- menambahkan satu buku --*/
ContentValues values = new ContentValues();
values.put(BooksProvider.TITLE,
((EditText)findViewById(R.id.txtTitle)).getText().toString());
values.put(BooksProvider.ISBN,
((EditText)findViewById(R.id.txtISBN)).getText().toString());
Uri uri = getContentResolver().insert(BooksProvider.CONTENT_URI, values);
Toast.makeText(getBaseContext(),uri.toString(),Toast.LENGTH_LONG).show();
}

public void onClickRetrieveTitles(View view){
/* --menampilkan judul-judul buku-- */
Uri allTitles = Uri.parse("content://com.example.provider.Books/books");
Cursor c;
if (Build.VERSION.SDK_INT < 11) {
/* -- sebelum honeycomb -- */
c = managedQuery(allTitles, null, null, null, "title desc");
} else {
/* honeycomb and later */
CursorLoader cursorLoader = new CursorLoader(
this, allTitles, null, null, null, "title desc");
c = cursorLoader.loadInBackground();
}

if (c.moveToFirst()) {
do {
Toast.makeText(this, c.getString(c.getColumnIndex(BooksProvider._ID))+
", " + c.getString(c.getColumnIndex(BooksProvider.TITLE))+
", " + c.getString(c.getColumnIndex(BooksProvider.ISBN)),
Toast.LENGTH_SHORT).show();
} while (c.moveToNext());
}
}
}
3. Jalankan di Android emulator Android Studio

4. Coba masukkan ISBN dan title untuk suatu buku dan klik pada tombol 'Add Title' seperti pada gambar berikut. Class 'Toast' akan menampilkan URI dari buku tersebut. Untuk menampilkan semua judul buku yang disimpan di 'content provider', klik tombol 'Retrieve Titles' dan coba lihat data yang ditampilkan melalui class 'Toast'.
Menggunakan content provider

Penjelasan:

Pertama, kita memodifikasi 'activity' sehingga user bisa memasukkan ISBN dan judul buku ke 'content provider' yang sudah dibuat sebelumnya.

Untuk menambahkan buku ke 'content provider', kita membuat object 'ContentValues' dan kemudian mengisinya dengan beberapa informasi tentang buku:
public void onClickAddTitle(View view) {
/* -- menambahkan satu buku --*/
ContentValues values = new ContentValues();
values.put(BooksProvider.TITLE,
((EditText)findViewById(R.id.txtTitle)).getText().toString());
values.put(BooksProvider.ISBN,
((EditText)findViewById(R.id.txtISBN)).getText().toString());
Uri uri = getContentResolver().insert(BooksProvider.CONTENT_URI, values);
Toast.makeText(getBaseContext(),uri.toString(),Toast.LENGTH_LONG).show();
}
Perhatikan bahwa karena 'content provider' kita berada dalam 'package' yang sama, kita bisa menggunakan konstanta 'BooksProvider.TITLE' dan 'BooksProvider.ISBN' untuk mengakses langsung kolom-kolom 'title' dan 'isbn'. Bila kita mengakses 'content provider' dari 'package' yang berbeda, maka kita tidak akan bisa menggunakan konstanta-konstanta tersebut. Dalam kasus seperti itu, kita perlu menentukan nama kolom secara langsung, seperti ini:
ContentValues values = new ContentValues();
values.put("title",
((EditText)findViewById(R.id.txtTitle)).getText().toString());
values.put("isbn",
((EditText)findViewById(R.id.txtISBN)).getText().toString());
Uri uri = getContentResolver().insert(Uri.parse(
"content://com.example.provider.Books/books),values);
Harap diperhatikan bahwa untuk 'package' eksternal, kita perlu mengacu ke URI dengan lengkap:
Uri.parse("content://com.example.provider.Books/books)
Berikutnya, untuk menampilkan semua judul buku dalam 'content provider', kita menggunakan potongan kode berikut ini:
public void onClickRetrieveTitles(View view){
/* --menampilkan judul-judul-- */
Uri allTitles = Uri.parse("content://com.example.provider.Books/books");
Cursor c;
if (Build.VERSION.SDK_INT < 11) {
/* --sebelum honeycomb-- */
c = managedQuery(allTitles, null, null, null, "title desc");
} else {
/* --honeycomb dan setelahnya-- */
CursorLoader cursorLoader = new CursorLoader(
this, allTitles, null, null, null, "title desc");
c = cursorLoader.loadInBackground();
}

if (c.moveToFirst()) {
do {
Toast.makeText(this, c.getString(c.getColumnIndex(BooksProvider._ID))+
", " + c.getString(c.getColumnIndex(BooksProvider.TITLE))+
", " + c.getString(c.getColumnIndex(BooksProvider.ISBN)),
Toast.LENGTH_SHORT).show();
} while (c.moveToNext());
}
}
Query di atas akan mengembalikan/menghasilkan hasil diurutkan (sort) secara 'descending' menurut kolom 'title'.

Andaikan bila kita ingin men-update detil-detil buku, kita panggil method 'update()' dengan URI, yang menunjukkan ID buku seperti berikut:
ContentValues editedValues = new ContentValues();
editedValues.put(BooksProvider.TITLE, "Android Tips and Tricks");
getContentResolver().update(Uri.parse(
"content://com.example.provider.Books.books/2"), editedValues, null, null);
dan bila ingin menghapus suatu buku, kita gunakan method 'delete()' dengan URI yang menunjukkan ID buku seperti berikut:
/*-- hapus satu judul buku--*/
getContentResolver().delete(Uri.parse(
"content://com.example.provider.Books.books/2"), null, null);
dan untuk menghapus semua buku, gampang saja, keluarkan ID buku dari URI seperti berikut:
/*-- hapus semua judul buku--*/
getContentResolver().delete(Uri.parse(
"content://com.example.provider.Books.books"), null, null);

No comments: