Perbedaan Tepat antara "Penyedia Konten" dan "Database SQLite"

87

saya telah melakukan pemrograman database SQLite untuk Android, tetapi saya tidak tahu apa-apa tentang Penyedia Konten kecuali ini: "Seperti yang saya rujuk ke halaman Pengembang Android, Android SDK menjelaskan tentang" Penyedia-konten "seperti yang digunakan untuk menyimpan dan mengambil data."

Tapi kemudian,

  1. Apa perbedaan persis antara "Penyedia-Konten" dan "Database SQLite"?
  2. Mana yang terbaik untuk menyimpan data, kapan?

Contoh atau bantuan apapun !!

Paresh Mayani
sumber

Jawaban:

135

Saya menemukan satu perbedaan utama, sebagai berikut:

Menyimpan data Anda dalam database adalah salah satu cara yang baik untuk mempertahankan data Anda , tetapi ada peringatan di Android-database yang dibuat di Android visiblehanya untuk aplikasi yang membuatnya. Artinya, database SQLite yang dibuat di Android oleh satu aplikasi hanya dapat digunakan oleh aplikasi itu, bukan oleh aplikasi lain.

Jadi, jika Anda, need to share data between applications, you need to use the content provider model as recommended in Android.Artikel ini menyajikan dasar-dasar penyedia konten dan bagaimana Anda bisa menerapkannya.

Saya menemukan artikel ini di tautan ini

Informasi yang sangat bagus disediakan.

Paresh Mayani
sumber
2
Sepertinya linknya sudah mati sekarang ... jangan lihat artikelnya lagi. Ingin melihat artikel yang Anda rujuk jika Anda menemukannya lagi.
prolink007
pada 11 Februari 2012 tautan http://www.devx.com/wireless/Article/41133 berfungsi,
k3b
Bagaimana jika kami menyediakan mekanisme dalam proses untuk berbagi data di beberapa aplikasi dengan cara yang aman?
Manohar
2
Keuntungan tambahan lainnya adalah penyedia konten menggunakan satu utas untuk setiap operasi, jadi beberapa utas tidak dapat memodifikasi basis data seperti dalam kasus sqlite
Rat-a-tat-a-tat Ratatouille
54

Apa perbedaan persis antara "Penyedia-Konten" dan "Database SQLite"?

ContentProvideradalah fasad - API yang dapat Anda terapkan yang mengekspos database ke proses lain. Ini dapat diterapkan dengan cara di mana data disimpan dalam database SQLite, tetapi tidak harus demikian.

Mana yang terbaik untuk menyimpan data, kapan?

Itu tidak mungkin untuk dijawab secara abstrak. Secara umum, kecuali ada sesuatu yang mengharuskan Anda untuk menggunakan ContentProvider, cukup gunakan database.

CommonsWare
sumber
26
Saya lebih suka menggunakan ContentProvider karena ini adalah abstraksi yang sangat bagus daripada SQL. Anda juga bisa bermain bagus dengan CursorAdapter dan permintaan otomatis.
alexanderblom
27

Saya telah membuat banyak aplikasi bagus dengan ribuan pengguna yang menggunakannya yang hanya menggunakan metode SQLite. Tapi itu beberapa waktu yang lalu dan saya harus menulis banyak kode secara manual yang sekarang dapat dengan mudah ditangani oleh ContentProvider. Saat itu saya tidak mendukung penggunaan Penyedia Konten karena sepertinya hanya menambah kompleksitas dalam kode.

Namun selama beberapa tahun terakhir, karena Android telah berkembang, saya telah pindah ke ContentProvider karena menghemat waktu dan memungkinkan Anda melakukan lebih banyak hal. Saya sekarang menggunakannya secara ekstensif. Setelah Anda memiliki kelas Penyedia Konten tertulis, hidup Anda menjadi jauh lebih mudah. Dengan ContentProvider saya dapat dengan mudah menangani Cursor Loader, Loader Callbacks, dan Bulk Inserts yang saya harus menulis semuanya secara manual di masa lalu dan tetap saja tidak berfungsi dengan efisien. Terutama saat memperbarui tampilan daftar, yang sekarang diperbarui secara otomatis berkat hanya satu metode notifychange (). Ini berarti sekarang saya tidak perlu mengetikkan pendengar saya sendiri dan memperbarui konten secara manual dalam tampilan daftar dan adaptor. Selain itu, saya tidak perlu khawatir tentang membuka dan menutup database atau khawatir tentang kebocoran memori. Itu semua ditangani oleh Penyedia Konten. Satu-satunya masalah yang sesekali saya hadapi adalah Anda tidak dapat melakukan beberapa kueri kompleks di ContentProviders. Dalam hal ini Anda masih dapat menggunakan kueri mentah dan menggunakan interaksi manual kuno dengan sqlite.

Jika Anda sebelumnya telah menulis DbAdapter, Helper, dan Observer Anda sendiri, Anda dapat meneruskannya ke aplikasi baru dengan aman tanpa menghabiskan waktu untuk mengonversi semuanya ke ContentProvider. Tetapi berdasarkan pengalaman saya, saya sangat menyarankan untuk pindah ke ContentProvider. Butuh beberapa waktu untuk membiasakannya, tetapi begitu Anda mengalaminya, Anda akan tetap menggunakannya.

UPDATE 2017 Sekarang saya telah beralih ke Realm , cara yang jauh lebih baik untuk menggunakan database di platform apa pun. Luangkan beberapa jam untuk mempelajarinya, dan hemat banyak waktu dalam karier pengembangan aplikasi Anda.

zeeshan
sumber
Saya berpikir untuk mengonversi kode saya ke penyedia konten tetapi sekarang saya berpikir untuk menyimpannya.
Mohammed Subhi Sheikh Quroush
Sekarang Anda juga dapat Menambahkan perpustakaan 'Kamar' Android
Ravindra Kushwaha
8

1. Penyedia Konten tidak Aman untuk Thread

Secara default, penyedia konten tidak aman untuk thread. Jika Anda memiliki beberapa utas menggunakan penyedia konten, Anda dapat melihat banyak pengecualian berbeda yang dilemparkan dan ketidakkonsistenan data lainnya. Cara termudah untuk memperbaikinya adalah dengan menggunakan kata kunci tersinkronisasi di setiap metode publik yang diekspos oleh penyedia konten.

Dengan cara ini, hanya satu utas pada satu waktu yang dapat mengakses metode ini.

2. Bersenang-senanglah saat melakukan banyak penulisan

Saya memiliki kebutuhan dalam aplikasi Serval Maps baru untuk mengimpor data dari file biner ke dalam database yang digunakan secara internal oleh aplikasi. Untuk melakukan ini dan bermain bagus dengan aplikasi lainnya, yang terbaik adalah:

Menelurkan utas baru untuk melakukan impor sehingga utas lain tidak terkena dampak negatif, terutama utas yang bertugas memperbarui UI; dan Jeda sebentar di akhir setiap impor untuk memberikan kesempatan lain kepada utas lain yang perlu menggunakan metode tersinkronisasi.

3. Penyedia konten terkadang memaksa Anda untuk berpikir lateral

Cara kerja penyedia konten di Android adalah menyediakan lapisan abstraksi antara kode Anda yang lain dan database yang mendasarinya. Hal ini terutama disebabkan oleh fakta, sejauh yang saya tahu, bahwa penyedia konten dapat mengakses data dari tempat selain database.

Ini berarti Anda tidak dapat mengeksekusi kueri SQL mentah pada database yang mendasarinya dan Anda perlu menentukan berbagai komponen kueri SQL menggunakan variabel yang diteruskan ke berbagai metode seperti metode kueri. Jika Anda memiliki tugas yang tidak sesuai dengan cara SQL ditangani oleh penyedia materi, Anda memiliki dua opsi:

Pikirkan secara lateral tentang kueri, mungkin Anda bisa mendapatkan data yang Anda butuhkan dengan kueri alternatif dan mengakses hasil dari kursor; dan Gunakan URI untuk mengakses data secara normal dan URI khusus yang cocok dengan kueri tertentu untuk tugas-tugas yang tidak memiliki alternatif.

chanu
sumber
Sesuai dengan ContentProvider, enam metode abstrak ContentProvider yang harus diimplementasikan dapat dipanggil oleh beberapa utas sekaligus, jadi metode itu harus diterapkan sebagai thread-safe. Kelas abstrak ContentProvider bukanlah alasan pengecualian kode tertentu tetapi untuk implementasi. Ikuti Proses dan Utas untuk menerapkan metode aman utas ContentProvider.
StahlRat
5

Penyedia Konten digunakan saat Anda ingin membagikan data Anda ke seluruh aplikasi.

Jika Anda memiliki database yang dilampirkan dengan aplikasi dan Anda ingin aplikasi lain menggunakan beberapa data, Anda bisa mengimplementasikan penyedia materi yang mengekspos data

Mina Samy
sumber
3

Perbedaan utamanya adalah: saat aplikasi Anda perlu membagikan informasi ke aplikasi lain, gunakan Penyedia Konten. SQLite hanya menyimpan data untuk aplikasi yang membuatnya

Daniel Uribe
sumber
3

Saya membaca jawaban ini sambil mencari keraguan yang sama, jadi berpikir untuk membagikannya. itu menyatakan -

Merupakan praktik yang baik untuk memberikan tingkat abstraksi ekstra atas data Anda agar 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, di mana seolah-olah Anda tidak menggunakannya, Anda dipaksa untuk mengubah semua area kode yang terpengaruh 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.

Jadi, menggunakan penyedia konten adalah ide yang bagus.

Darpan
sumber
3

Pikirkan Sistem Manajemen Konten tingkat lanjut. Setiap objek (halaman, gambar, artikel berita, item acara, dll.) Memiliki konten, alamat, izin pengguna, dan cara untuk berinteraksi dengannya dari berbagai bagian sistem. Penyedia Konten melakukannya untuk Android. Sekarang Anda dapat berbagi file atau gambar yang mungkin telah Anda simpan di aplikasi Anda. Anda juga dapat membuat objek kustom yang dapat dibagikan, seperti kontak bisnis, catatan yang dapat diedit, dll. Dan menentukan keamanan dan aplikasi default untuk menangani objek tersebut saat Anda membukanya dari aplikasi lain.

Roberto
sumber