11.1: Bagikan Data Melalui Penyedia Materi

Materi:

Apa yang dimaksud dengan Penyedia Materi?

ContentProvider adalah komponen yang berinteraksi dengan repositori. Aplikasi ini tidak perlu tahu di mana atau bagaimana data disimpan, diformat, atau diakses.

Penyedia materi:

  • Memisahkan data dari kode antarmuka aplikasi
  • Menyediakan cara standar mengakses data
  • Memungkinkan aplikasi berbagi data dengan aplikasi lainnya
  • Agnostik terhadap repositori, yang mungkin melalui database, sistem file, atau awan.

Apa yang dimaksud dengan Resolver Materi?

Untuk mendapatkan data dan berinteraksi dengan penyedia materi, aplikasi menggunakan ContentResolver untuk mengirimkan permintaan ke penyedia materi.

Objek ContentResolver menyediakan metode query(), insert(), update(), dan delete() untuk mengakses data dari penyedia materi.

Masing-masing permintaan terdiri dari URI dan kueri mirip-SQL, dan responsnya adalah objek Cursor.

Catatan: Anda telah mempelajari tentang kursor dalam bab Storage Data, dan nanti akan ada rangkuman dalam bab ini.

Diagram berikut menampilkan alur kueri dari aktivitas dengan menggunakan resolver materi, ke penyedia materi, ke data dalam database SQL, dan kembali lagi. Perhatikan, penyimpanan data umumnya dalam database SQLite, namun tidak wajib. Perjalanan kueri melalui komponen aplikasi

Contoh berbagi data aplikasi menggunakan Penyedia Materi

Anggaplah seperti aplikasi yang menyimpan persediaan topi dan menyediakannya untuk aplikasi lain yang ingin menjual topi. Aplikasi yang memiliki data mengelola persediaan, namun tidak memiliki antarmuka yang berinteraksi dengan pelanggan. Dua aplikasi, yang satu menjual topi merah dan yang satu lagi menjual topi hias, mengakses repositori persediaan, dan masing-masing mengambil data yang relevan untuk aplikasi belanja mereka. Diagram yang menampilkan bagaimana aplikasi lainnya bisa menggunakan penyedia materi.

Apa kegunaan Penyedia Materi

Penyedia materi berguna untuk aplikasi yang ingin menyediakan data bagi aplikasi lain.

  • Dengan penyedia materi, Anda bisa memungkinkan beberapa aplikasi lainnya untuk mengakses, menggunakan, dan memodifikasi sumber data tunggal yang disediakan oleh aplikasi Anda. Contoh: Persediaan di gudang untuk toko retail, skor game, atau kumpulan masalah fisika untuk universitas.
  • Untuk kontrol akses, Anda bisa menetapkan tingkatan izin penyedia materi, yang menetapkan cara aplikasi lain bisa mengakses data. Misalnya, toko mungkin tidak boleh mengubah data persediaan di gudang.
  • Anda bisa menyimpan data secara independen dari aplikasi, karena penyedia materi berada di antara antarmuka pengguna dan data yang disimpan. Anda bisa mengubah cara data disimpan tanpa perlu mengubah kode yang berinteraksi dengan pengguna. Misalnya, Anda bisa membangun prototipe aplikasi belanja menggunakan data persediaan tiruan, kemudian menggantinya nanti dengan database SQL untuk data sungguhan. Anda bahkan bisa menyimpan sebagian data di sistem awan serta sebagian lagi secara lokal, dan semua itu sama saja bagi pengguna.
  • Manfaat lain memisahkan data dari antarmuka pengguna dengan penyedia materi adalah karena tim development bisa bekerja secara independen pada antarmuka pengguna dan repositori data aplikasi Anda. Untuk aplikasi yang lebih besar dan kompleks, umumnya antarmuka pengguna dan backend data dikembangkan oleh tim yang berbeda, bahkan bisa berupa aplikasi terpisah; yakni, aplikasi dengan penyedia materi tidak harus memiliki antarmuka pengguna. Misalnya, aplikasi persediaan bisa terdiri dari data dan penyedia materi saja.
  • Ada kelas lain yang diharapkan berinteraksi dengan penyedia materi. Misalnya, Anda harus memiliki penyedia materi untuk menggunakan loader, seperti CursorLoader, untuk memuat data di latar belakang. Anda akan mempelajari tentang loader di bab berikutnya.
Catatan: Jika hanya aplikasi tersebut yang menggunakan data, dan Anda mengembangkannya sendiri, Anda mungkin tidak memerlukan penyedia materi.

Arsitektur Aplikasi dengan Penyedia Materi

Secara arsitektur, penyedia materi adalah layer di antara backend storage data aplikasi penyedia materi dan bagian aplikasi lainnya, yang memisahkan data dan antarmuka.

Untuk memberi Anda gambaran arsitektur penyedia materi secara menyeluruh, bagian ini menampilkan dan merangkum semua bagian arsitektur penyedia materi yang diimplementasikan, seperti yang ditampilkan dalam diagram berikut. Setiap bagian nanti akan dibahas secara detail. Arsitektur Penyedia Materi

Data dan Open Helper: Repositori data. Data bisa berada dalam database, file, internet, dihasilkan secara dinamis, atau bahkan campuran semua ini. Misalnya, jika Anda memiliki aplikasi kamus, kamus dasar bisa disimpan dalam database SQLite pada perangkat pengguna. Jika tidak ada dalam database, definisi bisa diambil dari internet, dan jika gagal, aplikasi bisa meminta pengguna untuk menyediakan definisi atau memeriksa ejaannya.

Data yang digunakan bersama penyedia materi umumnya disimpan dalam database SQLite, dan API penyedia materi akan mencerminkan asumsi ini.

Kontrak: Kontrak adalah kelas publik yang mengekspos informasi penting tentang penyedia materi ke aplikasi lainnya. Kontrak biasanya menyertakan skema URI, konstanta penting, dan struktur data yang akan dikembalikan. Misalnya, untuk aplikasi persediaan topi, kontrak bisa mengekspos nama kolom yang berisi harga serta nama produk, dan URL untuk mendapatkan item persediaan berdasarkan nomor komponen.

Penyedia Materi: Penyedia materi memperluas kelas ContentProvider dan menyediakan metode query(), insert(), update(), serta delete() untuk mengakses data. Selain itu, penyedia materi menyediakan antarmuka publik yang aman ke data, sehingga aplikasi lainnya bisa mengakses data dengan izin yang sesuai. Misalnya, untuk mendapatkan informasi dari database aplikasi Anda, aplikasi topi retail akan menghubungkan dengan penyedia materi, bukan dengan database secara langsung, karena ini tidak diizinkan.

Aplikasi yang memiliki data akan menetapkan izin apa yang diperlukan aplikasi lainnya untuk bekerja dengan penyedia materi. Misalnya, jika memiliki aplikasi yang menyediakan persediaan untuk toko retail, aplikasi Anda memiliki data dan menentukan izin akses aplikasi lainnya ke data. Izin ditetapkan dalam Manifes Android.

Resolver Materi: Penyedia materi selalu diakses melalui resolver materi. Anggaplah resolver materi sebagai kelas helper yang mengelola semua detail hubungan dengan penyedia materi untuk Anda. Pencerminan API penyedia materi, objek ContentResolver memberi Anda metode query(), insert(), update(), dan delete() untuk mengakses data penyedia materi. Misalnya, untuk mendapatkan semua item persediaan berupa topi merah, aplikasi toko merah akan membangun kueri untuk topi merah, dan menggunakan resolver materi untuk mengirim kueri itu ke penyedia materi.

Mengimplementasikan Penyedia Materi

Dengan merujuk diagram sebelumnya, untuk mengimplementasikan penyedia materi, Anda perlu:

  • Data, misalnya, dalam sebuah database.
  • Cara untuk mengakses storage data, misalnya, melalui open helper untuk database.
  • Deklarasi penyedia materi Anda dalam Manifes Android untuk menyediakannya bagi aplikasi Anda sendiri dan aplikasi lainnya.
  • Subkelas ContentProvider yang mengimplementasikan metode query(), insert(), delete(), update(), count(), dan getType().
  • Kelas kontrak publik yang mengekspos skema URI, nama tabel, tipe MIME, dan konstanta penting ke kelas dan aplikasi lainnya. Walaupun tidak wajib, tanpa kelas ini, aplikasi lainnya tidak bisa mengetahui cara mengakses penyedia materi Anda.
  • Resolver materi untuk mengakses penyedia materi dengan menggunakan metode dan kueri yang sesuai.

Mari kita lihat setiap komponen ini.

Data

Data sering kali disimpan dalam database SQLite, namun ini tidak wajib. Data bisa disimpan dalam file atau sistem file, di internet, atau dibuat secara dinamis. Atau bahkan campuran berbagai opsi ini. Bagi aplikasi, resolver materi, data yang diambil selalu berupa objek Cursor, seolah-olah berasal dari sumber yang sama dan dalam format yang sama.

Penyedia materi bisa mengakses data secara langsung jika berupa file, atau melakukannya melalui kelas helper. Misalnya, umumnya aplikasi menggunakan open helper untuk berinteraksi dengan database SQLite, dan penyedia materi berinteraksi dengan open helper untuk mendapatkan data.

Umumnya, data disajikan kepada penyedia materi oleh penyimpan data berupa tabel, mirip seperti tabel database, dengan masing-masing baris menyatakan satu entri dan setiap kolom menyatakan atribut untuk entri itu. Misalnya, setiap baris berisi satu kontak, dan mungkin memiliki kolom untuk alamat email dan nomor telepon. Struktur tabel akan diekspos dalam kontrak.

Catatan: Jika hanya bekerja dengan file, Anda bisa menggunakan kelas FileProvider yang telah didefinisikan sebelumnya.

Kontrak

Kontrak adalah kelas publik yang mengekspos informasi penting tentang penyedia materi aplikasi sehingga aplikasi lain tahu cara mengakses dan menggunakan penyedia materi.

Menggunakan kontrak akan memisahkan informasi aplikasi yang bersifat publik dari privat, desain dari implementasi, dan memberi aplikasi lain satu tempat untuk mendapatkan semua informasi yang mereka perlukan untuk bekerja dengan penyedia materi. Walaupun aplikasi yang mendasarinya mungkin berubah, kontrak mendefinisikan API yang idealnya tidak berubah setelah aplikasi dipublikasikan.

Kontrak untuk penyedia materi umumnya meliputi:

  • URI materi dan skema URI. Skema URI menampilkan cara membangun URI untuk mengakses data penyedia materi. Ini adalah API untuk data.
  • Konstanta tabel. Menyediakan tabel dan nama kolom sebagai konstanta, karena keduanya dibutuhkan untuk mengekstrak data dari objek kursor yang dikembalikan.
  • Tipe MIME, yang memiliki informasi mengenai format data, sehingga aplikasi bisa memproses data yang dikembalikan dengan semestinya. Misalnya, data bisa dienkode dalam JSON atau HTML, atau menggunakan format khusus.
  • Konstanta bersama lainnya yang membuat aplikasi lebih praktis menggunakan penyedia materi.
Catatan: Kontrak tidak terbatas untuk penyedia materi. Anda bisa menggunakan kontrak kapan saja diinginkan untuk berbagi konstanta dengan kelas-kelas aplikasi atau menyediakan informasi tentang aplikasi Anda kepada aplikasi lainnya.

Skema URI & URI Materi

Aplikasi mengirim permintaan ke penyedia materi menggunakan Uniform Resource Identifiers atau URI.

URI materi untuk penyedia materi memiliki bentuk umum ini:

scheme://authority/path/ID
  • scheme selalu content:// untuk URI materi.
  • authority menyatakan domain, dan untuk penyedia materi biasanya berakhiran .provider
  • path adalah jalur menuju data.
  • ID secara unik mengidentifikasi rangkaian data yang akan ditelusuri.

Misalnya, URI berikut bisa digunakan untuk meminta semua entri di tabel "words":

content://com.android.example.wordcontentprovider.provider/words

Skema URI untuk mengakses penyedia materi didefinisikan dalam Contract sehingga hanya tersedia bagi aplikasi yang ingin melakukan kueri ke penyedia materi ini. Biasanya, ini dilakukan dengan mendefinisikan konstanta untuk AUTHORITY, CONTENT_PATH, dan CONTENT_URI.

  • AUTHORITY. Menyatakan domain. Untuk penyedia materi, ini menyertakan nama paket yang unik dan berakhiran .provider
  • CONTENT_PATH. Jalur materi adalah identifier semantik abstrak dari data yang diminati. Jalur data tidak memprediksi atau menganggap dalam bentuk apa data disimpan atau diatur di latar belakang. Dengan demikian, jalur bisa diurai ke dalam nama tabel, nama file, atau nama daftar.
  • CONTENT_URI. Ini adalah URI bergaya content:// ke satu rangkaian data. Jika memiliki beberapa "kontainer data" di backend, Anda harus membuat satu URI materi untuk masing-masing kontainer. Misalnya, Anda ingin membuat URI materi ke masing-masing tabel yang bisa dikueri. Gunakan kelas helper URI untuk membangun dan memanipulasi URI.

Dalam kode, ini akan terlihat seperti berikut:

public static final String AUTHORITY =
"com.android.example.minimalistcontentprovider.provider";

public static final String CONTENT_PATH =  "words";
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY +
"/" + CONTENT_PATH);

Tabel dalam Kontrak

Cara umum untuk mengatur suatu kelas kontrak adalah menempatkan definisi yang bersifat global terhadap database Anda ke dalam level kelas akar. Biasanya, ini adalah nama database.

Buat kelas dalam abstrak statis untuk setiap tabel dengan nama kolom. Kelas dalam ini biasanya mengimplementasikan antarmuka BaseColumns. Dengan mengimplementasikan antarmuka BaseColumns, kelas Anda bisa mewarisi bidang kunci utama bernama _ID yang diharapkan ada oleh beberapa kelas Android, seperti adapter kursor. Hal ini tidak diharuskan, namun bisa membantu database Anda untuk bekerja harmonis dengan kerangka kerja Android.

Kode Anda dalam kontrak akan tampak seperti ini:

public static final String DATABASE_NAME = "wordlist";

public static abstract class WordList implements BaseColumns {
    public static final String WORD_LIST_TABLE = "word_entries";
    // Column names...
    public static final String KEY_ID = "_id";
    public static final String KEY_WORD = "word"
}

Tipe MIME

Tipe MIME memberi tahu aplikasi, tentang tipe dan format data yang diterima, sehingga bisa memproses data dengan semestinya. Tipe MIME yang umum antara lain text/html untuk laman web, dan application/json. Jika penyedia materi mengembalikan data dalam salah satu dari kedua format standar itu, Anda harus menggunakan tipe MIME standar. Daftar lengkap tipe standar ini tersedia di situs web IANA MIME Media Types.

Akan tetapi, penyedia materi mungkin akan mengembalikan data khusus untuk aplikasi Anda. Dalam hal itu, Anda akan perlu menetapkan tipe MIME khusus.

Untuk URI materi yang menunjuk ke sebuah baris atau beberapa baris data tabel, dan yang bersifat unik untuk aplikasi Anda, tipe MIME harus dalam format MIME khusus vendor Android. Format umum adalah:

type.subtype/provider-specific-part

Dengan bagian-bagiannya:

  • Bagian type: vnd
  • Bagian subtype:
    • Jika pola URI adalah untuk satu baris tunggal: android.cursor.item/
    • Jika pola URI adalah untuk lebih dari satu baris: android.cursor.dir/
  • Bagian provider-specific: vnd..
  • Anda menyediakan dan .
    • Nilai secara global harus unik. Pilihan bagus untuk adalah nama perusahaan Anda atau beberapa bagian dari nama paket Android aplikasi.
    • Nilai harus unik untuk pola URI yang bersangkutan. Pilihan bagus untuk adalah string yang mengidentifikasi tabel yang terkait dengan URI.

Misalnya, jika otoritas penyedia adalah com.example.app.provider, dan mengekspos tabel bernama "words", maka tipe MIME untuk beberapa baris dalam "words" adalah:

vnd.android.cursor.dir/vnd.com.example.provider.words

Untuk baris tunggal "words", tipe MIME adalah:

vnd.android.cursor.item/vnd.com.example.provider.words

Dan Anda harus menetapkannya dalam kontrak sebagai:

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";

Suatu aplikasi bisa memanggil metode getType() dari penyedia materi untuk mengetahui tipe data yang diharapkan. Metode getType() akan terlihat seperti ini:

@Override
public String getType(Uri uri) {
   switch (sUriMatcher.match(uri)) {
       case URI_ALL_ITEMS_CODE:
           return MULTIPLE_RECORDS_MIME_TYPE;
       case URI_ONE_ITEM_CODE:
           return SINGLE_RECORD_MIME_TYPE;
       default:
           return null;
   }
}

Baca selengkapnya tentang tipe MIME untuk penyedia materi dalam dokumentasi developer Android.

Catatan: Tipe MIME tidak memberi tahu klien cara memproses data. Dengan demikian, tipe MIME khusus hanya menyediakan petunjuk, dan kontrak harus menyediakan informasi tambahan kepada klien mengenai format data yang diharapkan.

Metode: insert, delete, update, query

Resolver materi menyediakan metode query, insert, delete, serta update, dan penyedia materi mengimplementasikan metode yang sama itu untuk mengakses data.

Dengan demikian, praktik yang baik adalah mempertahankan nama, argumen metode, dan nilai kembalian yang konsisten di antara semua komponen. Hal ini membuat implementasi dan pemeliharaan menjadi jauh lebih mudah.

Diagram berikut menampilkan API di antara blok pembangunan konseptual aplikasi yang menggunakan penyedia materi untuk mengakses data. Terutama perhatikan:

  • Metode tersebut diberi nama yang sama dan mengembalikan tipe data yang sama di seluruh tumpukan (kecuali untuk insert()).
  • Karena biasanya penyedia materi menghubungkan ke database, metode kueri akan mengembalikan kursor. Jika backend Anda bukan database, penyedia materi harus melakukan pekerjaan mengonversi data yang dikembalikan ke dalam format kursor.
  • Diagram ini tidak menampilkan kelas helper tambahan, seperti open helper untuk database, yang mungkin juga menggunakan konvensi API yang sama. Gunakan tanda tangan metode yang sama untuk metode query - insert - delete - dan update di semua komponen aplikasi

Bila Anda membuat penyedia materi dengan memperluas kelas ContentProvider, Anda perlu mengimplementasikan metode insert, delete, update, dan query. Jika Anda mengikuti prinsip pembuatan tanda tangan metode sama di seluruh komponen, maka penerusan data bolak-balik tidak memerlukan banyak kode.

Inilah metode contoh dalam penyedia materi. Perhatikan, penyedia materi menerima nilai untuk disisipkan dalam tipe yang tepat, seperti ContentValues, memanggil database, dan membangun serta mengembalikan URI yang diperlukan untuk resolver materi.

Metode insert

/**
* Inserts one row.
*
* @param uri Uri for insertion.
* @param values Container for Column/Row key/value pairs.
* @return URI for the newly created entry.
*/
@Override
public Uri insert(Uri uri, ContentValues values) {
   long id = mDB.insert(values);
   return Uri.parse(CONTENT_URI + "/" + id);
}

Metode delete

/**
* Deletes records(s) specified by selectionArgs.
*
* @param uri URI for deletion.
* @param selection Where clause.
* @param selectionArgs Where clause arguments.
* @return Number of records affected.
*/
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
   return mDB.delete(parseInt(selectionArgs[0]));
}

Metode update

/**
* Updates records(s) specified by selection/selectionArgs combo.
*
* @param uri URI for update.
* @param values Container for Column/Row key/value pairs.
* @param selection Where clause.
* @param selectionArgs Where clause arguments.
* @return Number of records affected.
*/
@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
   return mDB.update(parseInt(selectionArgs[0]), values.getAsString("word"));
}

Metode query()

Metode query dalam penyedia materi memiliki tanda tangan berikut:

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

Argumen menyatakan bagian-bagian kueri SQL dan akan dibahas di bawah ini. Metode kueri penyedia materi harus mem-parse argumen URI dan menentukan aksi yang sesuai.

Pencocokan URI

Praktik yang baik adalah menggunakan instance kelas UriMatcher untuk mencocokkan URI. UriMatcher adalah kelas helper untuk mencocokkan URI bagi penyedia materi.

  1. Buat UriMatcher baru dalam penyedia materi Anda.
    private static UriMatcher sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    
  2. Dalam onCreate() tambahkan URI yang akan dicocokkan dengan matcher. Ini adalah URI materi yang didefinisikan dalam Contract. Anda mungkin perlu melakukannya dalam metode tersendiri, initializeUriMatching() yang Anda panggil dalam onCreate(). Kode contoh menyertakan URI yang meminta semua item, satu item berdasarkan ID, dan hitungan item.
/**
* Defines the accepted Uri schemes for this content provider.
* Calls addURI() for all of the content URI patterns that the provider should recognize.
*/
private void initializeUriMatching() {

   // Matches a URI that is just the authority + the path,
   // triggering the return of all words.
   sUriMatcher.addURI(AUTHORITY, CONTENT_PATH, URI_ALL_ITEMS_CODE);

   // Matches a URI that references one word in the list by its index.
   sUriMatcher.addURI(AUTHORITY, CONTENT_PATH + "/#", URI_ONE_ITEM_CODE);

   // Matches a URI that returns the number of rows in the table.
   sUriMatcher.addURI(AUTHORITY, CONTENT_PATH + "/" + COUNT, URI_COUNT_CODE);
}

Metode query mengaktifkan URI pencocokan untuk melakukan kueri database bagi semua item, satu item, atau satu hitungan item, seperti yang ditampilkan dalam kode contoh ini.

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

   Cursor cursor = null;

   // Determine integer code from the URI matcher and switch on it.
   switch (sUriMatcher.match(uri)) {
       case URI_ALL_ITEMS_CODE:
           cursor =  mDB.query(ALL_ITEMS);
           Log.d(TAG, "case all items " + cursor);
           break;
       case URI_ONE_ITEM_CODE:
           cursor =  mDB.query(parseInt(uri.getLastPathSegment()));
           Log.d(TAG, "case one item " + cursor);
           break;
       case URI_COUNT_CODE:
           cursor = mDB.count();
           Log.d(TAG, "case count " + cursor);
           break;
       case UriMatcher.NO_MATCH:
           // You should do some error handling here.
           Log.d(TAG, "NO MATCH FOR THIS URI IN SCHEME: " + uri);
           break;
       default:
           // You should do some error handling here.
           Log.d(TAG, "INVALID URI - URI NOT RECOGNIZED: "  + uri);
   }
   return cursor;
}

Menggunakan Resolver Materi

Objek ContentResolver menyediakan metode untuk data query(), insert(), delete(), dan update(). Karena itu, resolver materi mencerminkan API penyedia materi dan mengelola semua interaksi dengan penyedia materi untuk Anda. Dalam kebanyakan situasi, Anda bisa menggunakan penyedia materi default yang disediakan oleh sistem Android.

Kursor

Penyedia materi selalu menyajikan hasil kueri sebagai Cursor dalam format tabel yang menyerupai database SQL. Hal ini tidak dipengaruhi oleh cara penyimpanan data sebenarnya.

Kursor adalah pointer ke dalam baris data terstruktur. Anda bisa menganggapnya sebagai daftar baris yang ditautkan. Kelas Cursor menyediakan metode untuk menggerakkan kursor melalui struktur itu, dan metode untuk mendapatkan data dari kolom setiap baris.

Bila suatu metode mengembalikan Cursor, ulangi hasilnya, ekstrak data, lakukan sesuatu dengan data, dan terakhir tutup kursor untuk membebaskan memori.

Jika Anda menggunakan database SQL, seperti yang ditampilkan di atas, Anda bisa mengimplementasikan open helper untuk mengembalikan kursor, kemudian sekali lagi, penyedia materi mengembalikan kursor melalui resolver materi. Jika storage data mengembalikan data dalam format berbeda, Anda nanti harus mengonversinya menjadi kursor, biasanya MatrixCursor.

Metode query()

Untuk membuat kueri ke penyedia materi:

  1. Buat sebuah kueri bergaya SQL.
  2. Gunakan resolver materi untuk berinteraksi dengan penyedia materi guna mengeksekusi kueri dan mengembalikan sebuah Cursor.
  3. Proses hasilnya di Cursor.

Metode kueri memiliki tanda tangan berikut:

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

Argumen untuk metode ini menyatakan bagian-bagian kueri SQL. Sekalipun menggunakan backend jenis lain, Anda tetap harus menerima kueri dalam gaya ini dan menangani argumen dengan semestinya.

uri

URI materi lengkap yang dikueri. Tidak boleh nol. Dapatkan informasi untuk URI yang benar dari kontrak. Misalnya:

String queryUri = Contract.CONTENT_URI.toString();

projection

Sebuah larik string dengan nama-nama kolom yang akan dikembalikan untuk setiap baris. Menyetelnya ke nol akan mengembalikan semua kolom. Misalnya:

String[] projection = new String[] {Contract.CONTENT_PATH};

selection

Menunjukkan baris/catatan objek mana yang ingin Anda akses. Ini adalah klausa WHERE yang mengecualikan where yang sebenarnya. Misalnya:

String where = KEY_WORD + " LIKE ?";

selectionArgs

Nilai-nilai argumen untuk kriteria selection. Jika Anda menyertakan ?s dalam selection, maka itu akan digantikan oleh nilai-nilai dari selectionArgs, sesuai urutan munculnya. PENTING: Praktik keamanan terbaik adalah selalu memisahkan selection dan selectionArgs. Misalnya:

String[]whereArgs = new String[]{searchString};

sortOrder

Urutan mengurutkan hasil. Diformat berupa klausa SQL ORDER BY (dengan mengecualikan kata kunci ORDER BY). Biasanya ASC atau DESC; null akan meminta susunan urutan default, yang boleh jadi tidak berurutan.

Dan buatlah kueri ke penyedia materi seperti ini:

Cursor cursor = getContentResolver().query(Uri.parse(queryUri), projection, selectionClause, selectionArgs, sortOrder);
Catatan: Metode insert, delete, dan update disediakan untuk kepraktisan dan kejelasan. Secara teknis, metode query bisa menangani semua permintaan, termasuk untuk menyisipkan, menghapus, dan memperbarui data.

Izin untuk berbagi

Secara default, aplikasi tidak bisa mengakses data aplikasi lainnya. Kedua aplikasi yang terlibat dalam berbagi data harus memiliki izin untuk melakukannya.

  • Penyedia materi harus mengizinkan aplikasi lainnya untuk mengakses datanya.
  • Pengguna harus mengizinkan aplikasi klien untuk mengakses penyedia materi.

Izin dari penyedia materi

Agar penyedia materi terlihat dan tersedia untuk aplikasi lain, Anda perlu mendeklarasikan dalam AndroidManifest penyedia.

<provider android:name=".WordListContentProvider" android:authorities="com.android.example.wordlistsqlwithcontentprovider.provider" android:exported="true"/>

Properti android:exported membuatnya eksplisit karena aplikasi lain bisa menggunakan penyedia materi ini.

Bila tidak ada izin yang disetel secara eksplisit, semua aplikasi lainnya bisa mengakses penyedia materi untuk membaca dan menulis. Untuk membatasi dan membuat batasan akses yang eksplisit, setel izin di dalam tag provider pada penyedia materi, dengan myapp adalah nama unik aplikasi Anda:

android:readPermission="com.android.example.wordlistsqlwithcontentpfonrovider.PERMISSION"
android:writePermission="com.android.example.wordlistsqlwithcontentprovider.PERMISSION"
  • String izin harus unik untuk penyedia materi Anda, sehingga hanya memberi privilese untuk penyedia materi.
  • Walaupun string bisa berupa apa saja, penggunaan nama paket akan menjamin keunikannya.

Izin yang diminta aplikasi klien dari pengguna

Untuk mengakses penyedia materi, aplikasi klien perlu mendeklarasikan izin dalam Manifes Android untuk penyedia materi itu.

<uses-permission android:name = "com.android.example.wordlistsqlwithcontentprovider.PERMISSION"/>

Izin tidak dibahas secara detail dalam konsep ini.

Anda bisa mengetahui selengkapnya dalam Mendeklarasikan Izin, Izin Sistem, dan Mengimplementasikan Izin Penyedia Materi.

Praktik terkait

Dokumentasi praktik terkait ada di Dasar-Dasar Developer Android: Praktik.

Ketahui selengkapnya

Dokumentasi Developer:

Video:

results matching ""

    No results matching ""