İçerik Sağlayıcı ne zaman kullanılır?


103

İçerik Sağlayıcıların, uygulamalar arasında herkese açık olarak veri paylaşımına izin vermek için yapıldığını anlıyorum. Ancak, herhangi birinin yalnızca kendi uygulamanızda kullanmak üzere bir İçerik Sağlayıcı yapma konusunda düşünceleri olup olmadığını merak ediyorum. Bunu yapmanın herhangi bir avantajı var mı? Herhangi bir dezavantaj var mı?

Geçmişte veritabanımdaki verilere erişmek için SQliteOpenHelper'ı yeni uyguladım, ancak bir İçerik Sağlayıcı oluşturmayı düşünüyorum. Veri talep etmeye yönelik URI yaklaşımının açık ve öz olduğunu düşünüyorum. Öte yandan, yalnızca uygulamam için bir İçerik Sağlayıcı kullanmak gereksiz (çünkü içinde bir SQliteOpenHelper sınıfına sahip olacağım) ve ihtiyacım olandan daha fazla iş olacak mı?


2
İçerik sağlayıcıyı yazmayı kolaylaştırmak için bir kitaplık yaptım. Düz SQLiteOpenHelper yazmaktan bile daha kolay. github.com/coocood/VContentProvider
coocood

Yanıtlar:


59

Verileri paylaşmayı planlamıyorsanız, İçerik Sağlayıcıları düşünmeyin. Güçlüdürler ancak yazmaları zordur ve bunları dahili olarak kullanacaksanız uygulamak aptalca olacaktır.

Ancak, herhangi birinin yalnızca kendi uygulamanızda kullanmak üzere bir İçerik Sağlayıcı yapma konusunda düşünceleri olup olmadığını merak ediyorum.

Elbette ... örneğin, yazdığım eski bir TODO listesi uygulaması için, diğer uygulamaların görev durumlarını almasına ve bunlara erişmesine izin vermek için bir içerik sağlayıcı yazmam gerekiyordu. Gereksinimlerin bir parçasıydı, ancak bundan daha fazlası mantıklıydı ve uygulamayı daha güzel hale getirdi.


35
Gerekçenize katılıyorum, ancak aynı zamanda (özellikle yeni başlayanlar için) İçerik Sağlayıcı uygulandığında pek çok fayda sağlamanın önemli olduğunu düşünüyorum. Örneğin, CursorLoadereşzamansız sorgular gerçekleştirmek için kullanabilirsiniz ... sorguları gerçekleştirmek için tek bir örneğe (the ContentResolver) erişiminiz vardır , vb. Tabii ki SQLite veritabanınız için kullanmak üzere kendi Yükleyicinizi uygulayabilirsiniz ... tabii ki siz tüm uygulama genelinde tek bir veritabanı örneğine erişim sağlayabilir ... ve tabii ki paylaşmak istemediğiniz sürece bir ContentProvider gerekli değildir
Alex Lockwood

12
diğer uygulamalarla ilgili veriler. Bununla birlikte, kendi İçerik Sağlayıcınızı uygulamanın getirdiği birçok avantaj vardır, bu nedenle uygulamanız verilerini paylaşmadığı için dikkate almayı bırakmamalısınız.
Alex Lockwood

8
Evet, tamamen haklısın ama yine de çoğu durumda çabaya değmediğini düşünüyorum. En az 12 farklı Android uygulaması yaptım (Play Store'da yayınlandı) ve hiçbir zaman bir ContentProvider. Aslında, üzerinde çalıştığımız son uygulama başlangıçta a ile yapılmıştı ContentProviderve kullanması gerekenden daha çok baş belası olduğu için bunu sildik (temel ContentProviders'yi uygulamayı kolaylaştırmak için bir kitaplık bile yazdım : github.com/casidiablo/persistence, ancak onu hiç kullanmamıştım XD).
Cristian

1
@Cristian en pratik tavsiyeleri verir. Android belgesi bile, ContentProviderihtiyacımız yoksa kullanmamamız gerektiğini belirtiyor - "Kullanım tamamen kendi uygulamanızda ise ve ihtiyacınız yoksa, veritabanlarını veya diğer kalıcı depolama türlerini kullanmak için bir sağlayıcıya ihtiyacınız yok Yukarıda listelenen özelliklerden herhangi biri. Bunun yerine, Uygulama Verilerini Kaydetme sayfasında açıklanan depolama sistemlerinden birini kullanabilirsiniz. " Aksi takdirde, mühendisliğin biraz üzerindeyiz.
Cheok Yan Cheng

Özet: Verilerinizi paylaşmayı planlamıyorsanız, İçerik Sağlayıcı'dan kaçınabilirsiniz, ancak diğer yandan İçerik Sağlayıcı, uygulamanızın veritabanını değiştirmek istiyorsanız hayatınızı kolaylaştırır. örneğin SQLite'den MangoDB'ye.
Prashant

117

ContentProviderHerkese açık yapmak istemeseniz bile a kullanmanın kesinlikle iyi bir fikir olduğunu iddia ediyorum .

Dahili olarak değiştirmeyi kolaylaştırmak için verileriniz üzerinde ekstra soyutlama düzeyi sağlamak iyi bir uygulamadır. Altta yatan veritabanı yapısını daha sonra değiştirmeye karar verirseniz ne olur? A kullanırsanız ContentProvider, içindeki tüm yapısal değişiklikleri içerebilir, bir tane kullanmıyormuş gibi, yapısal değişikliklerden etkilenen kodun tüm alanlarını değiştirmek zorunda kalırsınız. Ayrıca, kodunuzu veritabanına düşük seviyeli erişimle karıştırmak yerine, verilere erişmek için aynı standart API'yi yeniden kullanabilmek güzel.

Ayrıca, gelecekte verilerinizi ifşa etme şansınız her zaman vardır. Bir ContentProviderön kullanmazsanız , daha sonraki bir tarihte onu güçlendirmek çok daha zor olacaktır.

Ayrıca, Android'in ContentProviders kullanılması gereken / önerilen diğer bölümleri ve SyncAdapterörneğin veri erişimini içeren bir Uygulama Widget'ı istiyorsanız.

Özet olarak, bir ContentProviderön yazı yazmanın çok az ek yükü vardır (zaten iyi bir fikir olan API'yi öğrendikten sonra), bu nedenle bunu yapmak, özel veriler için bile mantıklıdır.


1
Daha fazla katılamadım. Sizi, veri katmanınızı, yeni bir geliştiricinin kullanıcı arayüzünü onunla eşleştirememesini sağlayacak şekilde soyutlamaya zorlar.
Gabriel

3
Android'i öğrendikten hemen sonra tam da bu nedenle aynı şekilde düşünmeye başladım. Kamuya açık olmasa bile, mimari kararlarınızın artan soyutlamasından ve tek uygulama noktasından her zaman yararlanabilirsiniz. ContentProviders'ı seviyorum.
davidcesarino

2
Bu öznitelikle içerik sağlayıcıyı yalnızca kendi uygulamanız için kullanılabilir hale getirebilirsiniz:android:exported="false"
Toby 1 Kenobi

4
Benim naçizane görüşüme göre, ContentProvider'ı uygulamaya gerek kalmadan verilerinizi tamamen soyut bir şekilde kullanabilir ve kullanmalısınız.
hmartinezd

2
Dahili sqlite db'm için (diğer uygulamalarla etkileşim olmadan) bir içerik sağlayıcı çözümü uygulama yolundayken, developer.android.com/guide/topics/providers/… adresinde bir sağlayıcıya ihtiyacınız olmadığını
Selçuk Cihan

7

Eclipse için MOTODEV Studio'ya bir göz atın. Eclipse'i genişleten bir geliştirme ortamıdır. Bir veritabanı için otomatik olarak bir içerik sağlayıcı oluşturabileceğiniz bir araçları vardır. Bir içerik sağlayıcı verilerinize erişimi kolaylaştırıyorsa ve performans üzerinde önemli bir etkisi yoksa, devam edin ve kullanın. Çoğu senaryoda durum bu olacaktır.


5

Kısacası, verilerinizi etkili bir şekilde yönetmenizeContent Providers yardımcı olur . Bunları aşağıdaki nedenlerle kullanmanızı öneririm.

  • Kullanıcı arayüzünüz ve veri tabanınız arasında bir soyutlama katmanı görevi görür . Kullanıcı tarafından girilen verileri doğrulamak için ContentProviders'da veri doğrulaması uygulayabilirsiniz . Ayrıca , kullanıcı arayüzüne ve diğer bölümlere dokunmadan veritabanının yapısını değiştirmenize olanak tanır .
  • Gibi diğer android çerçeve sınıflarıyla güzelce oynuyorlar SyncAdapter. Örneğin, bir veritabanındaki bir değer değiştiğinde ContentProviders ile birlikte bir listeyi otomatik olarak yenileyebilirsiniz CursorLoader. ContentProviders olmadan, bunun gibi birçok işlevi kendi başınıza uygulamanız gerekir.
  • Özel verilerimizi diğer uygulamalara güvenle ifşa edebiliriz . ContentProviders kullanmak, verilerimizi diğer uygulamalarla kolay ve güvenli bir şekilde paylaşmamızı sağlar.

Dolayısıyla, şu anda bu işlevlerden herhangi birine ihtiyacınız olmasa bile, gelecekte onlara ihtiyacınız olabilir ve fazladan yol kat etmek ve bunları hemen şimdi uygulamak iyidir.


Mükemmel cevap. ContentProvidersBunları kullanmamız için tek cümlelik açıklama ve üç ayrı neden. Bazen basit açıklamalar en iyisidir. +1
AdamInTheOculus

4

ContentProviders'ı kavramanın biraz zor olduğunu kabul ediyorum, ancak kendi uygulamanız için dahili olarak kullanmak isteseniz bile kesinlikle faydalıdırlar. Bununla ilgili en iyi şey, içerik sağlayıcıları uygun URI'ler için özelleştirebilmenizdir.

Veritabanınızda 5 tablonuzun olabileceği bir senaryo, ancak bunları kullanmadan önce belirli siparişlerde birkaçını birleştirmeniz gerekir. Ve bu birleşimlerin her biri için bir içerik URI'si oluşturun. Daha sonra bu URI'leri her biri tablo olarak kullanabilirsiniz :)

İçerik Sağlayıcı ile devam etmenizi öneririm, ne kadar güçlü olduğunu görünce şaşıracaksınız.


2

Benim bakış açıma göre, içerik sağlayıcı, diğer uygulamalarla veri paylaşmayı tek başına bırakan birçok avantajla geliyor. Bir Sync-Adapter kullanarak sunucuyla senkronize etmeniz gerekiyorsa, google bulut mesajlaşmasını kullanın, DB'deki temel veriler Yükleyicileri kullanarak değiştiğinde kullanıcı arayüzünü otomatik olarak güncelleyin, arama uygulayın, widget kullanın ... bu durumda içerik sağlayıcı tam size göre.

Yönergeyi takip etmenizi tercih ederim çünkü bir gün içerik sağlayıcıya ekli yukarıdaki özelliklerden bazılarını uygulamanız gerekebilir.

Bu arada, içerik sağlayıcı oluşturucuyu kullanarak veritabanınızı ve CP'nizi 5 dakikadan daha kısa sürede hızlı bir şekilde oluşturabilirsiniz.


1

Belgelerde belirtildiği gibi: İçerik sağlayıcı oluşturma

Kullanım tamamen kendi uygulamanız dahilindeyse, SQLite veritabanını kullanmak için bir sağlayıcıya ihtiyacınız yoktur.

Öyleyse neden bu ek yükü geliştirmeye çalışalım? Daha kolay ve daha hızlı geliştirme istiyorsunuz, değil mi? Yani bir soyutlama katmanı (SQLiteOpenHelper descendent) yeterlidir.

Occam's Razor'a bakın Çok iyi bir neden olmadan bir varlık yapmayın.


0

Diğer uygulamalarla veri paylaşmak istemiyorsanız içerik sağlayıcıyı kullanmayın. Veritabanı işlemlerini gerçekleştirmek için basit sqlitedatabase kullanın. Gizli bilgileri saklamak için içerik sağlayıcıları kullanırken dikkatli olun, çünkü gizli bilgilerinize başka uygulamalar erişebilir.


Varsayılan olarak içerik sağlayıcıları açık değildir ve bunlara yönelik erişim kısıtlamalarını yönetmek kolaydır. Yanlış bilgileri yaymak için olumsuz oy verin.
TBridges42

2
@ TBridges42 Yanılıyorsunuz. Aslında API Seviye 17 İçerik Sağlayıcıları ortaya çıkana kadar . Ve yanıtın verildiği zamana kadar Android cihazların% 25'i bu davranıştan etkilendi ve yine de yorumunuz sırasında% 10'u etkilendi . Öyleyse, tam tersi: yorumunuz tehlikelidir, çünkü gerçek olan / olmayan güvenli bir şey ifade ettiğiniz için.
Murmel

0

Bir İçerik Sağlayıcı kullanmak, ek bir soyutlama düzeyinde yardımcı olabilir - Kendi uygulamanıza koymak, projenize önemli bir geliştirme süresi kazandırır. Ancak, birden çok uygulama arasında veri, uygulama ayarları veya yapılandırmaları paylaşmak için kullanıyorsanız, o zaman İçerik Sağlayıcı sizin seçiminizdir.

Güvenlik seviyelerinize dikkat edin ve İçerik Sağlayıcınız SQLite'a yazıyorsa, sıfırlamadaki verileri (DAR) şifrelemek için SQLcipher kullanmanızı tavsiye ederim. (Birkaç çözümde bir içerik sağlayıcı kullandım ve hata ayıklama ve test için operasyonel değerlerin canlı bir "anlık görüntüsünü" alma yeteneği sağladım.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.