Tugas 1. Mengunduh dan menjalankan kode dasar
-
Unduh aplikasi WordListSQLInterative dan MinimalistContentProvider
-
Buat salinan WordListSQLInterative dan jalankan pada Android Studio
-
Ubah nama paket menjadi wordlistsqlwithcontentprovider
Tugas 2. Menambahkan kelas Contract ke WordListSQLInteractive
2.1 Tambahkan kelas Contract
-
Tambahkan kelas final publik ke proyek Anda dan beri nama Contract.
Kelas Contract ini berisi semua informasi yang diperlukan aplikasi lain untuk menggunakan penyedia konten aplikasi Anda. Anda bisa memberi nama apa pun pada kelas ini, tetapi umumnya disebut sebagai “Contract”.
public final class Contract {}
-
Agar kelas Contract tidak dibuat instance-nya, tambahkan constructor pribadi yang kosong.
Ini adalah pola standar untuk kelas yang digunakan untuk menampung informasi meta dan konstanta untuk aplikasi.
private Contract() {}
2.2 Pindahkan konstanta database ke dalam Contract
Pindahkan DATABASE_NAME dan buat menjadi publik.
public static final String DATABASE_NAME = "wordlist";
Buat kelas dalam WordList yang mengimplementasikan BaseColumns.
public static abstract class WordList implements BaseColumns {
}
2.3 Definsikan Konstanta URI
Deklarasikan skema URI untuk penyedia konten Anda.
Menggunakan Contract di MinimalistContentProvider sebagai contoh, deklarasikan AUTHORITY, CONTENT_PATH. Tambahkan CONTENT_PATH_URI untuk mengembalikan semua item dan ROW_COUNT_URI yang mengembalikan nomor entri. Di AUTHORITY, gunakan nama aplikasi Anda.
public static final int ALL_ITEMS = -2;
public static final String COUNT = "count";
public static final String AUTHORITY =
"com.android.example.wordlistsqlwithcontentprovider.provider";
public static final String CONTENT_PATH = "words";
public static final Uri CONTENT_URI =
Uri.parse("content://" + AUTHORITY + "/" + CONTENT_PATH);
public static final Uri ROW_COUNT_URI =
Uri.parse("content://" + AUTHORITY + "/" + CONTENT_PATH + "/" + COUNT);
2.4 Deklarasikan tipe MIME
- Deklarasikan tipe MIME untuk satu atau beberapa respons catatan:
static final String SINGLE_RECORD_MIME_TYPE = "vnd.android.cursor.item/vnd.com.example.provider.words"; static final String MULTIPLE_RECORDS_MIME_TYPE = "vnd.android.cursor.item/vnd.com.example.provider.words";
- Jalankan aplikasi Anda. Aplikasi harus berjalan dan tampak dan bertindak persis seperti sebelum Anda mengubahnya.
Tugas 3. Membuat Penyedia Konten
3.1 Buat kelas WordListContentProvider
- Buat kelas baru yang memperluas ContentProvider dan beri nama WordListContentProvider.
- Deklarasikan UriMatcher.
- Deklarasikan variabel kelas WordListOpenHelper, mDB.
-
Deklarasikan kode untuk URI matcher sebagai konstanta.
Ini akan menyatukan kode di satu tempat dan memudahkannya diubah. Gunakan kelipatan sepuluh, sehingga menyisipkan kode tambahan bisa langsung dilakukan.
private static final int URI_ALL_ITEMS_CODE = 10; private static final int URI_ONE_ITEM_CODE = 20; private static final int URI_COUNT_CODE = 30;
- Ubah metode onCreate() untuk
- menginsialisasi mDB dengan WordListOpenHelper,
- memanggil metode initializeUriMatching() yang akan Anda buat nanti,
- dan mengembalikan true.
@Override public boolean onCreate() { mDB = new WordListOpenHelper(getContext()); initializeUriMatching(); return true; }
- Buat metode void pribadi initializeUriMatching().
-
Di initializeUriMatching(), tambahkan URI ke matcher untuk mendapatkan semua item, satu item, dan jumlahnya.
Periksa Contract dan gunakan metode initializeUriMatching() di aplikasi MinimalistContentProver sebagai template.
3.2 Implementasikan WordListContentProvider.query()
Gunakan MiniContentProvider sebagai template untuk mengimplementasikan metode query().
- Modifikasi WordListContentProvider.query().
- Gunakan pernyataan Switch untuk kode yang dikembalikan oleh sUriMatcher.
- Untuk URI_ALL_ITEMS_CODE, URI_ONE_ITEM_CODE, URI_COUNT_CODE, panggil yang sesuai di WordListOpenHelper (mDB).
3.3 Perbaiki WordListOpenHelper.query() untuk mengembalikan Cursor dan menangani pengembalian semua item.
- Tambahkan kode dengan sebuah kueri untuk mengembalikan semua item dari database untuk menangani kasus
cursor = mDB.query(ALL_ITEMS)
dari pernyataan Switch di atas. -
Sederhanakan WordListOpenHelper.query() agar mengembalikan kursor.
Ini memperbaiki kesalahan di WordListContentProvider.query().
Akan tetapi, ini merusak WordListOpenHelper.OnBindViewHolder(), yang mengharapkan WordItem dari WordListOpenHelper.
3.4 Perbaiki WordListOpenHelper.count() untuk mengembalikan sebuah Cursor
- Buat MatrixCursor menggunakan Contract.CONTENT_PATH.
3.5 Perbaiki WordListAdapter.onBindViewHolder() untuk menggunakan resolver konten
Tambahkan variabel instance untuk parameter kueri karena akan digunakan lebih dari sekali.
Resolver konten mengambil parameter kueri, yang harus Anda bangun. Pembuatan struktur kueri sama dengan kueri SQL, tetapi sebagai ganti pernyataan Selection, kueri menggunakan URI. Parameter kueri sangat mirip dengan kueri SQL.
Buat resolver konten dengan parameter kueri yang ditetapkan dan simpan hasilnya di sebuah Cursor yang disebut sebagai cursor. (Lihat MainActivity aplikasi MinimalistContentProvider untuk contohnya.)
String word = "";
int id = -1;
Cursor cursor = mContext.getContentResolver().query(Uri.parse(
queryUri), null, null, null, sortOrder);
Ganti panggilan ke mDB.delete(id) di callback tombol DELETE dengan panggilan resolver konten yang akan dihapus.
selectionArgs = new String[]{Integer.toString(id)};
int deleted = mContext.getContentResolver().delete(
Contract.CONTENT_URI, Contract.CONTENT_PATH, selectionArgs);
3.6 Ubah WordListAdapter.getItemCount() untuk menggunakan resolver konten
Sebagai ganti meminta hitungan dari database, getItemCount() harus tersambung ke resolver konten dan meminta hitungan. Di Contract, Anda mendefinisikan URI untuk mendapatkan hitungan tersebut:
public static final String COUNT = "count";
public static final Uri ROW_COUNT_URI =
Uri.parse("content://" + AUTHORITY + "/" + CONTENT_PATH + "/" + COUNT
3.7 Tambahkan penyedia konten ke Manifes Android
- Periksa logcat untuk melihat penyebab kesalahan (yang sangat umum).
- Tambahkan penyedia konten ke Manifes Android di dalam tag
<application>
.<provider android:name=".WordListContentProvider" android:authorities="com.android.example.wordlistsqlwithcontentprovider.provider"> </provider>
Tugas 4. Mengimplementasikan Metode Penyedia Konten
4.1 getType()
Metode getType() dipanggil oleh aplikasi lain yang ingin menggunakan penyedia konten ini, untuk melihat jenis data seperti apa yang dikembalikan oleh aplikasi Anda.
Gunakan pernyataan Switch untuk mengembalikan tipe MIME yang sesuai.
- Tipe MIME dicantumkan dalam Contract.
- SINGLE_RECORD_MIME_TYPE adalah untuk URI_ALL_ITEMS_CODE
- MULTIPLE_RECORDS_MIME_TYPE adalah untuk URI_ONE_ITEM_CODE
4.2 Panggil penyedia konten untuk menyisipkan dan memperbarui kata di MainActivity.
Untuk memperbaiki operasi penyisipan, MainActivity().onActivityResult perlu memanggil penyedia konten, bukan database untuk menyisipkan dan memperbarui kata.
- Di MainActivity, hapus deklarasi mDB dan pembuatan instance-nya.
Di OnActivityResult()
Menyisipkan:
- Jika panjang kata tidak nol, buat variabel ContentValues bernama “values” dan tambahkan kata yang dimasukkan oleh pengguna ke dalamnya menggunakan string “word” sebagai kunci.
- Ganti mDB.insert(word); dengan permintaan insert ke sebuah resolver konten.
Memperbarui:
- Ganti mDB.update(id, word); dengan permintaan update ke sebuah resolver konten.
4.3 Implementasikan insert() di penyedia konten
Metode insert() di penyedia konten merupakan pass-through. Jadi, Anda
- memanggil metode insert() OpenHelper,
- mengonversi long id yang dikembalikan ke sebuah URI konten ke item yang disisipkan,
- dan mengembalikan URI tersebut.
-
public Uri insert(Uri uri, ContentValues values) { long id = mDB.insert(values); return Uri.parse(CONTENT_URI + "/" + id); }
4.4 Perbaiki insert() di WordListOpenHelper
Android Studio melaporkan kesalahan untuk parameter values.
- Buka WordListOpenHelper. Metode insert() ditulis untuk mengambil parameter String.
- Ubah parameter menjadi tipe ContentValues.
- Hapus deklarasi dan penetapan values di isi metode.
4.5 Implementasikan update() di penyedia konten
Perbaiki metode update dengan cara yang sama seperti yang Anda pakai untuk memperbaiki metode insert.
- Di WordListContentProvider, implementasikan update(), yang merupakan satu baris kode yang meneruskan id dan word sebagai argumen.
return mDB.update(parseInt(selectionArgs[0]), values.getAsString(Contract.WordList.KEY_WORD));
- Anda tidak perlu membuat perubahan apa pun untuk memperbarui WordListOpenHelper.
4.6 Implementasikan delete() di penyedia konten
Di WordListContentProvider, implementasikan metode delete() dengan memanggil metode delete() di WordListOpenHelper dengan di kata untuk dihapus.
return mDB.delete(parseInt(selectionArgs[0]));