11.1A: Mengimplementasikan Penyedia Konten Minimalis

Tugas 1. Membuat proyek MinimalistContentProvider

  1. Di MainActivity, buat variabel anggota untuk tampilan teks dan lakukan inisialisasi di onCreate().
  2. Di onClickDisplayEntries(), gunakan pernyataan switch untuk memeriksa tombol mana yang ditekan. Gunakan view id untuk mengenali tombol. Cetak pernyataan log untuk setiap kasus.
  3. Di onClickDisplayEntries(), di bagian akhir, tambahkan beberapa teks ke TextView.
  4. Seperti biasanya, ekstrak sumber daya string.

Tugas 2: Membuat kelas Contract, URI, dan data tiruan

2.1. Buat kelas Contract

  1. Buat kelas Java Contract publik yang baru dengan tanda tangan berikut. Ini harus final.
    public final class Contract {}
    
  2. Untuk mencegah seseorang tidak sengaja membuat instance kelas Contract, berikan constructor pribadi kosong.
    private Contract() {}

  1. Di kelas Contract, buat sebuah konstanta untuk AUTHORITY. Untuk menjadikan Authority unik, gunakan nama paket yang ditambah dengan “provider.” public static final String AUTHORITY = "com.android.example.minimalistcontentprovider.provider";
  2. Buat konstanta untuk CONTENT_PATH. Jalur konten mengidentifikasi data. Anda harus menggunakan sesuatu yang deskriptif, misalnya, nama tabel atau file atau jenis data, misalnya “words”.
    public static final String CONTENT_PATH = "words";
  3. Buat konstanta untuk CONTENT_URI. Ini adalah URI yang bergaya content:// yang menunjuk ke satu rangkaian data. Jika Anda memiliki beberapa “data container” di backend, Anda harus membuat URI konten untuk masing-masing data container tersebut.

    [URI[(https://developer.android.com/reference/android/net/Uri.html) adalah kelas helper untuk membangun dan memanipulasi URI. Karena ini tidak pernah berubah, string untuk semua instance kelas Contract, Anda bisa melakukan inisialisasi secara statis. public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY + "/" + CONTENT_PATH);

  4. Buat konstanta bantu untuk ALL_ITEMS. Ini adalah nama kumpulan data yang akan Anda gunakan saat mengambil semua kata. Nilainya -2 karena ini adalah nilai terendah pertama yang tidak dikembalikan oleh panggilan metode. static final int ALL_ITEMS = -2;
  5. Buat konstanta bantu untuk WORD_ID. Ini adalah id yang akan Anda gunakan saat mengambil satu kata. static final String WORD_ID = "id";

  1. Deklarasikan tipe MIME untuk satu item data.
    static final String SINGLE_RECORD_MIME_TYPE = "vnd.android.cursor.item/vnd.com.example.provider.words";
    
  2. Deklarasikan tipe MIME untuk beberapa catatan.
    static final String MULTIPLE_RECORD_MIME_TYPE = "vnd.android.cursor.dir/vnd.com.example.provider.words";

2.4 Buat data tiruan

Penyedia konte selalu menyajikan hasil sebagai Cursor dalam format tabel yang mirip dengan database SQL. Ini terpisah dari bagaimana data sebenarnya disimpan. Aplikasi ini menggunakan larik string kata.

Dalam strings.xml, tambahkan satu daftar kata yang pendek:

<string-array name="words">
   <item>Android</item>
   <item>Activity</item>
   <item>ContentProvider</item>
   <item>ContentResolver</item>
</string-array>

 

Tugas 3: Mengimplementasikan kelas MiniContentProvider

  1. Buat kelas Java MiniContentProvider yang memperluas ContentProvider. (Untuk praktik ini, jangangunakan opsi menu Create Class > Other > Content Provider.)
  2. Implementasikan metode (Code > Implement methods).
  3. Tambahkan tag log.
  4. Tambahkan variabel anggota untuk data tiruan.
    public String[] mData;
    
  5. Di onCreate(), inisialisasikan mData dari larik kata dan kembalikan true.
    @Override
    public boolean onCreate() {
       Context context = getContext();
       mData = context.getResources().getStringArray(R.array.words);
       return true;
    }
    
  6. Tambahkan pesan log ke metode insert, delete, dan update. Anda tidak akan mengimplementasikan metode ini untuk praktik ini.
    Log.e(TAG, "Not implemented: update uri: " + uri.toString());

3.2. Terbtikan penyedia konten dengan menambahkannya ke manifest Android.

Untuk mengetahui penyedia konten, aplikasi Anda dan aplikasi lain perlu mengetahui bahwa penyedia konten ada. Tambahkan deklarasi untuk penyedia konten ke manifes Android di dalam sebuah .

Deklarasi berisi nama penyedia konten dan otoritas (identifier uniknya).

  1. Dalam AndroidManifest, di dalam tag aplikasi, setelah tag penutup aktivitas, tambahkan:
    <provider
        android:name=".MiniContentProvider"
    android:authorities="com.android.example.minimalistcontentprovider.provider" />

3.3. Persiapkan pencocokan URI

Buat perubahan berikut di kelas MiniContentProvider.

  1. Dalam kelas MiniContentProvider, buat variabel statis pribadi untuk UriMatcher.

    Argumen untuk constructor menentukan nilai untuk dikembalikan jika tidak ada kecocokan. Sebagai praktik terbaik, gunakan UriMatcher.NO_MATCH.

    private static UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    
  2. Buat metode Anda sendiri untuk menginisialisasi URI matcher.
    private void initializeUriMatching(){}
  3. Dalam metode initializeUriMatching(), tambahkan URI yang diterima penyedia konten Anda ke matcher dan tetapkan sebagai kode integer. Ini adalah URI berdasarkan otoritas dan jalur konten yang ditetapkan di Contract.

    Simbol # mencocokkan string karakter numerik dengan panjang berapa saja. Di aplikasi ini, ini mengacu pada indeks kata di larik string. Di aplikasi produksi, ini bisa jadi id entri dalam database. Tetapkan URI ini nilai numerik 1.

    sUriMatcher.addURI(Contract.AUTHORITY, Contract.CONTENT_PATH + "/#", 1);
    
  4. URI kedua adalah yang Anda tentukan di Contract untuk mengembalikan semua item. Tetapkan nilai numerik 0. sUriMatcher.addURI(Contract.AUTHORITY, Contract.CONTENT_PATH, 0);

3.4 Implementasikan metode getType()

Metode getType() penyedia konten mengembalikan tipe MIME untuk setiap URI yang ditetapkan.

Kecuali Anda melakukan sesuatu yang khusus di kode Anda, implementasi metode ini akan sangat mirip untuk penyedia konten apa pun. Ini melakukan yang berikut:

  1. Mencocokkan URI.
  2. Mengaktifkan kode yang dikembalikan.
  3. Mengembalikan tipe MIME yang sesuai.

3.5 Implementasikan metode query()

Metode query()

Metode query memiliki tanda tangan berikut:

public Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder){}

3.6. Implementasikan metode populateCursor()

 

Tugas 4: Menggunakan ContentResolver untuk mendapatkan data

4.1. Dapatkan content resolver

  1. Di MainActivity, hapus semua kode dari dalam onClickDisplayEntries().
  2. Tambahkan kode ini ke onClickDisplayEntries() di MainActivity.
    Cursor cursor = getContentResolver().query(Uri.parse(queryUri), projection, selectionClause, selectionArgs, sortOrder);

4.2. Definisikan argumen kueri

Agar getContentResolver.query() bisa berfungsi, Anda harus mendeklarasikan dan menetapkan nilai ke semua argumennya.

  1. URI: Deklarasikan ContentURI yang mengidentifikasi penyedia konten dan tabel. Dapatkan informasi untuk URI yang benar dari contract.
    String queryUri = Contract.CONTENT_URI.toString();
    
  2. Projection: Sebuah larik string dengan nama kolom untuk dikembalikan. Menyetel ini ke null akan mengembalikan semua kolom. Jika hanya ada satu kolom, seperti di contoh ini, menyetel ini secara eksplisit adalah opsional, tetapi bisa berguna untuk tujuan dokumentasi. // Only get words. String[] projection = new String[] {Contract.CONTENT_PATH};
  3. selectionClause: Klausa argumen untuk kriteria pilihan, yaitu, baris mana yang akan dikembalikan. Diformat sebagai klausa SQL WHERE (mengecualikan kata kunci “WHERE”). Meneruskan null akan mengembalikan semua baris untuk tampilan URI yang diberikan. Karena ini akan berbeda sesuai dengan tombol mana yang ditekan, deklarasikan ini sekarang dan setel nanti.
    String selectionClause;
    
  4. selectionArgs: Nilai argumen untuk kriteria pilihan. Jika Anda menyertakan ? di String selection, ? akan digantikan oleh nilai dari selectionArgs, dengan urutan munculnya.
    PENTING: Praktik terbaik keamanan adalah selalu memisahkan selection dan selectionArgs.

    String selectionArgs[];

  5. sortOrder: Urutan untuk mengurutkan hasil. Diformat sebagai klausa SQL ORDER BY (mengecualikan kata kunci ORDER BY). Biasanya ASC atau DESC; null meminta tata urutan default, yang bisa jadi tidak berurutan.
    // For this example, accept the order returned by the response.
    String sortOrder = null;

4.3. Putuskan kriteria selection

Nilai selectionClause dan selectionArgs bergantung pada tombol mana yang ditekan di UI.

  • Untuk menampilkan semua kata, setel kedua argumen ke null.
  • Untuk mendapatkan kata pertama, kueri kata dengan ID 0. (Ini mengasumsikan bahwa ID kata dimulai dari 0 dan dibuat sesuai urutan. Anda mengetahui ini, karena informasinya diperlihatkan di contract. Untuk penyedia konten yang berbeda, sebaiknya ketahui id-nya dan telusuri dengan cara yang berbeda.)
  1. Ganti blok switch yang sudah ada dengan kode berikut ini di onClickDisplayEntries, sebelum Anda mendapatkan content resolver.
  2. switch (view.getId()) {
       case R.id.button_display_all:
           selectionClause = null;
           selectionArgs = null;
           break;
       case R.id.button_display_first:
           selectionClause = Contract.WORD_ID + " = ?";
           selectionArgs = new String[] {"0"};
           break;
       default:
           selectionClause = null;
           selectionArgs = null;
    }

4.4. Proses Cursor

Setelah mendapatkan content resolver, Anda harus memproses hasil dari Cursor.

  • Jika ada data, tampilkan di TextView.
  • Jika tidak ada data, laporkan kesalahan.
  1. Periksa kode berikut dan pastikan Anda memahami semuanya.
       if (cursor != null) {
       if (cursor.getCount() > 0) {
           cursor.moveToFirst();
           int columnIndex = cursor.getColumnIndex(projection[0]);
           do {
               String word = cursor.getString(columnIndex);
               mTextView.append(word + "\n");
           } while (cursor.moveToNext());
       } else {
           Log.d(TAG, "onClickDisplayEntries " + "No data returned.");
           mTextView.append("No data returned." + "\n");
       }
       cursor.close();
    } else {
       Log.d(TAG, "onClickDisplayEntries " + "Cursor is null.");
       mTextView.append("Cursor is null." + "\n");
    }
    
  2. Sisipkan kode ini di akhir onClickDisplayEntry().
  3. Jalankan aplikasi Anda.
  4. Klik tombol untuk melihat data yang diambil di TextView.

 

Leave a Reply

Your email address will not be published. Required fields are marked *