Kapan menggunakan Penyedia Konten

103

Saya memahami bahwa Penyedia Konten dibuat untuk mengizinkan berbagi data antar aplikasi secara publik. Namun, saya ingin tahu apakah ada yang memiliki pemikiran tentang membuat Penyedia Konten untuk digunakan hanya dalam aplikasi Anda sendiri. Apakah ada keuntungan melakukan ini? Ada kerugian?

Di masa lalu, saya baru saja menerapkan SQliteOpenHelper untuk mengakses data dari database saya, tetapi saya sedang mempertimbangkan untuk membuat Penyedia Konten. Saya merasa pendekatan URI untuk meminta data jelas dan ringkas. Di sisi lain, akankah menggunakan Penyedia Konten hanya untuk aplikasi saya menjadi berlebihan (karena di dalamnya saya akan memiliki kelas SQliteOpenHelper) dan lebih banyak pekerjaan daripada yang saya butuhkan?

Pzanno
sumber
2
Saya membuat perpustakaan agar penyedia konten mudah ditulis. Bahkan lebih mudah daripada menulis SQLiteOpenHelper biasa. github.com/coocood/VContentProvider
coocood

Jawaban:

59

Jika Anda tidak berencana untuk berbagi data, jangan pikirkan tentang Penyedia Konten. Mereka kuat tetapi sulit untuk ditulis dan akan konyol untuk menerapkannya jika Anda akan menggunakannya secara internal.

Namun, saya ingin tahu apakah ada yang memiliki pemikiran tentang membuat Penyedia Konten untuk digunakan hanya dalam aplikasi Anda sendiri.

Tentu saja ... misalnya, untuk aplikasi daftar TODO lama yang saya tulis, saya harus menulis penyedia konten untuk mengizinkan aplikasi lain mengambil dan mengakses status tugas. Itu adalah bagian dari persyaratan, tetapi lebih dari itu masuk akal dan membuat aplikasi lebih bagus.

Cristian
sumber
34
Saya setuju dengan pembenaran Anda, tetapi menurut saya penting (terutama bagi pemula) bahwa setelah Penyedia Konten diterapkan, Anda mendapatkan banyak manfaat. Misalnya, Anda dapat menggunakan CursorLoaderuntuk melakukan kueri asinkron ... Anda memiliki akses ke instance tunggal (the ContentResolver) untuk melakukan kueri, dll. Tentu saja Anda dapat mengimplementasikan Loader Anda sendiri untuk digunakan untuk database SQLite Anda ... tentu saja Anda dapat menerapkan akses ke satu instance database di seluruh aplikasi ... dan tentu saja Penyedia Konten tidak diperlukan kecuali Anda ingin membagikannya
Alex Lockwood
11
data dengan aplikasi lain. Meskipun demikian, ada banyak manfaat yang didapat dengan mengimplementasikan Penyedia Konten Anda sendiri, jadi Anda tidak boleh membatalkannya dari pertimbangan hanya karena aplikasi Anda tidak membagikan datanya.
Alex Lockwood
8
Ya, Anda sepenuhnya benar tetapi saya masih berpikir itu tidak sepadan dengan usaha dalam banyak kasus. Saya telah melakukan setidaknya 12 aplikasi Android yang berbeda (dipublikasikan ke Play Store) dan tidak pernah membutuhkan file ContentProvider. Faktanya, aplikasi terakhir yang kami kerjakan awalnya dibuat dengan a ContentProviderdan kami baru saja menghapusnya karena sebenarnya lebih merepotkan untuk digunakan daripada yang seharusnya (saya bahkan menulis perpustakaan untuk membuatnya lebih mudah menerapkan ContentProviders dasar : github.com/casidiablo/persistence tetapi belum pernah menggunakannya sendiri XD).
Cristian
1
@Cristian memberikan saran paling praktis. Bahkan dokumen Android menyatakan bahwa kita tidak boleh menggunakan ContentProviderjika kita tidak perlu - "Anda tidak memerlukan penyedia untuk menggunakan database atau jenis penyimpanan persisten lainnya jika penggunaan sepenuhnya ada dalam aplikasi Anda sendiri dan Anda tidak perlu salah satu fitur yang tercantum di atas. Sebagai gantinya, Anda dapat menggunakan salah satu sistem penyimpanan yang dijelaskan di halaman Menyimpan Data Aplikasi. ". Jika tidak, kita hanya sekedar rekayasa.
Cheok Yan Cheng
Ringkasan: Jika Anda tidak berencana untuk membagikan data Anda, Anda dapat menghindari Penyedia Konten tetapi di sisi lain Penyedia Konten membuat hidup Anda lebih mudah jika Anda ingin mengubah database aplikasi Anda. misalnya dari SQLite ke MangoDB.
Prashant
116

Saya berpendapat bahwa menggunakan a adalah ide yang bagus ContentProvidermeskipun Anda tidak bermaksud untuk mempublikasikannya.

Ini praktik yang baik untuk memberikan tingkat abstraksi ekstra atas data Anda untuk membuatnya lebih mudah untuk diubah secara internal. Bagaimana jika Anda memutuskan untuk mengubah struktur database yang mendasarinya di lain waktu? Jika Anda menggunakan, ContentProviderAnda dapat memuat semua perubahan struktural di dalamnya, seolah-olah Anda tidak menggunakannya, Anda akan dipaksa untuk mengubah semua area kode yang dipengaruhi oleh perubahan struktural. Selain itu, senang dapat menggunakan kembali API standar yang sama untuk mengakses data daripada mengotori kode Anda dengan akses tingkat rendah ke database.

Selain itu, selalu ada kemungkinan Anda ingin mengekspos data Anda di masa mendatang. Jika Anda tidak menggunakan bagian ContentProviderdepan, akan jauh lebih sulit untuk memasangnya kembali di kemudian hari.

Lalu, ada bagian lain dari Android ContentProvideryang diperlukan / direkomendasikan seperti saat menggunakan SyncAdapterdan jika Anda menginginkan Widget Aplikasi yang melibatkan akses data misalnya.

Singkatnya, ada sedikit biaya tambahan yang terlibat dalam penulisan di ContentProviderawal (setelah Anda mempelajari API yang merupakan ide bagus) jadi masuk akal untuk melakukannya, bahkan untuk data pribadi.

Paul Drummond
sumber
1
Saya sangat setuju. Ini memaksa Anda untuk mengabstraksi lapisan data Anda dengan cara yang secara praktis memastikan pengembang baru tidak akan dapat memasangkan UI dengannya.
Gabriel
3
Segera setelah mempelajari Android, saya mulai berpikir dengan cara yang sama persis untuk alasan ini. Bahkan jika bukan publik, Anda selalu bisa mendapatkan keuntungan dari peningkatan abstraksi dan satu titik implementasi keputusan arsitektural Anda. Saya suka ContentProviders.
davidcsb
1
Anda dapat membuat penyedia konten hanya tersedia untuk aplikasi Anda sendiri dengan atribut ini:android:exported="false"
Toby 1 Kenobi
4
Menurut pendapat saya, Anda dapat, dan harus menangani data Anda dengan cara yang sepenuhnya abstrak, tanpa perlu menerapkan ContentProvider.
hmartinezd
2
Ketika saya sedang dalam perjalanan menerapkan solusi penyedia konten untuk sqlite db internal saya (tidak ada interaksi dengan aplikasi lain), saya melihat komentar di developer.android.com/guide/topics/providers/… yang menyatakan Anda tidak memerlukan penyedia untuk menggunakan database SQLite jika penggunaan sepenuhnya ada dalam aplikasi Anda sendiri.
Selçuk Cihan
7

Kunjungi MOTODEV Studio for Eclipse. Ini adalah lingkungan pengembangan yang memperluas Eclipse. Mereka memiliki alat di mana Anda bisa secara otomatis membuat penyedia konten untuk database. Jika penyedia konten membuatnya lebih mudah untuk mengakses data Anda dan tidak berdampak signifikan pada kinerja, lanjutkan dan gunakan. Dalam kebanyakan skenario, hal ini akan terjadi.

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
sumber
5

Singkatnya, Content Providersmembantu dalam mengelola data Anda secara efektif . Saya akan menyarankan untuk menggunakannya karena alasan berikut.

  • Ini bertindak sebagai lapisan abstraksi antara UI dan database Anda . Anda dapat menerapkan validasi data di ContentProviders untuk memvalidasi data yang dimasukkan oleh pengguna. Ini juga memungkinkan Anda untuk mengubah struktur database tanpa menyentuh UI dan bagian lain.
  • Mereka bermain dengan baik dengan kelas kerangka Android lainnya seperti SyncAdapter. Misalnya, Anda dapat menyegarkan daftar secara otomatis, ketika nilai dalam database berubah menggunakan ContentProviders bersama CursorLoader. Tanpa ContentProviders, Anda harus menerapkan banyak fungsi seperti ini sendiri.
  • Kami dapat dengan aman mengekspos data pribadi kami ke aplikasi lain . Menggunakan ContentProviders akan memungkinkan kami untuk membagikan data kami dengan mudah dan aman dengan aplikasi lain.

Jadi, meskipun Anda tidak memerlukan salah satu dari fungsi ini sekarang, Anda mungkin membutuhkannya di masa depan dan ada baiknya untuk bekerja ekstra dan menerapkannya sekarang.

Siva Prakash
sumber
Jawaban yang bagus. Deskripsi kalimat tunggal ContentProvidersdan tiga alasan terpisah mengapa kita harus menggunakannya. Terkadang penjelasan sederhana adalah yang terbaik. +1
AdamInTheOculus
4

Saya setuju ContentProviders agak sulit dipahami tetapi mereka pasti membantu, bahkan jika Anda ingin menggunakannya secara internal untuk aplikasi Anda sendiri. Hal terbaiknya adalah Anda dapat menyesuaikan penyedia konten untuk URI yang sesuai.

Berikut adalah skenario di mana Anda mungkin memiliki 5 tabel dalam database Anda, tetapi Anda perlu menggabungkan beberapa tabel dalam pesanan tertentu sebelum menggunakannya. Dan buat URI materi untuk setiap gabungan ini. Kemudian Anda masing-masing dapat menggunakan URI ini sebagai tabel :)

Saya sarankan Anda melanjutkan dengan Penyedia Konten, Anda akan kagum melihat betapa hebatnya itu.

Shubhayu
sumber
2

Menurut pandangan saya, penyedia konten hadir dengan banyak keuntungan, apalagi hanya berbagi data dengan aplikasi lain. Jika Anda perlu menyinkronkan dengan server menggunakan Adaptor Sinkronisasi, gunakan perpesanan awan Google, perbarui UI secara otomatis saat data pokok di DB berubah menggunakan Loader, terapkan penelusuran, gunakan widget ... maka penyedia konten cocok untuk Anda.

Saya lebih suka Anda mengikuti panduan ini karena suatu hari Anda mungkin perlu menerapkan beberapa fitur di atas yang dilampirkan ke penyedia konten

Ngomong-ngomong, Anda bisa dengan cepat membangun database dan CP dalam waktu kurang dari 5 menit menggunakan generator penyedia konten

Phillip Kigenyi
sumber
1

Seperti yang dikatakan dalam dokumentasi: Membuat penyedia konten

Anda tidak memerlukan penyedia untuk menggunakan database SQLite jika penggunaan sepenuhnya ada dalam aplikasi Anda sendiri.

Jadi mengapa repot-repot mengembangkan overhead ini? Anda ingin pengembangan yang lebih mudah dan lebih cepat, bukan? Jadi satu lapisan abstraksi (SQLiteOpenHelper descendent) sudah cukup.

Lihat Occam's Razor Jangan membuat entitas tanpa alasan yang sangat bagus.

stoarch
sumber
0

Jangan gunakan penyedia konten jika tidak ingin berbagi data dengan aplikasi lain. Gunakan database persegi sederhana untuk melakukan operasi database. Berhati-hatilah saat menggunakan penyedia konten untuk menyimpan data rahasia karena informasi rahasia Anda dapat diakses oleh aplikasi lain

pengguna3030895
sumber
Secara default, penyedia konten tidak terekspos, dan mengelola pembatasan akses mudah dilakukan. Tidak suka menyebarkan informasi yang salah.
TBridges42
2
@ TBridges42 Anda (dulu) salah. Faktanya hingga Penyedia Konten API Level 17 terungkap . Dan hingga saat jawaban 25% perangkat Android terpengaruh dari perilaku ini dan masih 10% pada saat Anda berkomentar . Jadi, ini lebih sebaliknya: komentar Anda berbahaya, karena Anda menyatakan sesuatu yang harus diamankan yang bukan fakta.
Murmel
0

Menggunakan Penyedia Konten dapat membantu dalam tingkat abstraksi tambahan - Menempatkannya dalam aplikasi Anda sendiri akan menambah waktu pengembangan yang signifikan untuk proyek Anda. Namun jika Anda menggunakannya untuk berbagi data, pengaturan aplikasi, atau konfigurasi di beberapa aplikasi, maka Penyedia Konten adalah pilihan Anda.

Perhatikan tingkat keamanan Anda dan saya akan merekomendasikan penggunaan SQLcipher untuk mengenkripsi data-at-reset (DAR) jika Penyedia Konten Anda menulis ke SQLite. (Saya telah menggunakan penyedia konten dalam beberapa solusi dan memberikan kemampuan untuk mengambil "snap shot" langsung dari nilai operasional untuk debugging dan pengujian.)

Jim Row
sumber