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?
android
android-contentprovider
Pzanno
sumber
sumber
Jawaban:
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.
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.
sumber
CursorLoader
untuk melakukan kueri asinkron ... Anda memiliki akses ke instance tunggal (theContentResolver
) 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 membagikannyaContentProvider
. Faktanya, aplikasi terakhir yang kami kerjakan awalnya dibuat dengan aContentProvider
dan kami baru saja menghapusnya karena sebenarnya lebih merepotkan untuk digunakan daripada yang seharusnya (saya bahkan menulis perpustakaan untuk membuatnya lebih mudah menerapkanContentProvider
s dasar : github.com/casidiablo/persistence tetapi belum pernah menggunakannya sendiri XD).ContentProvider
jika 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.Saya berpendapat bahwa menggunakan a adalah ide yang bagus
ContentProvider
meskipun 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,
ContentProvider
Anda 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
ContentProvider
depan, akan jauh lebih sulit untuk memasangnya kembali di kemudian hari.Lalu, ada bagian lain dari Android
ContentProvider
yang diperlukan / direkomendasikan seperti saat menggunakanSyncAdapter
dan jika Anda menginginkan Widget Aplikasi yang melibatkan akses data misalnya.Singkatnya, ada sedikit biaya tambahan yang terlibat dalam penulisan di
ContentProvider
awal (setelah Anda mempelajari API yang merupakan ide bagus) jadi masuk akal untuk melakukannya, bahkan untuk data pribadi.sumber
android:exported="false"
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.
sumber
Singkatnya,
Content Providers
membantu dalam mengelola data Anda secara efektif . Saya akan menyarankan untuk menggunakannya karena alasan berikut.SyncAdapter
. Misalnya, Anda dapat menyegarkan daftar secara otomatis, ketika nilai dalam database berubah menggunakan ContentProviders bersamaCursorLoader
. Tanpa ContentProviders, Anda harus menerapkan banyak fungsi seperti ini sendiri.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.
sumber
ContentProviders
dan tiga alasan terpisah mengapa kita harus menggunakannya. Terkadang penjelasan sederhana adalah yang terbaik. +1Saya 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.
sumber
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
sumber
Seperti yang dikatakan dalam dokumentasi: Membuat penyedia konten
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.
sumber
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
sumber
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.)
sumber