Kiedy używać dostawcy treści

103

Rozumiem, że dostawcy treści zezwalają na publiczne udostępnianie danych między aplikacjami. Zastanawiam się jednak, czy ktoś myśli o tym, aby dostawca treści używał tylko w swojej własnej aplikacji. Czy miałoby to jakieś korzyści? Jakieś wady?

W przeszłości właśnie zaimplementowałem SQliteOpenHelper, aby uzyskać dostęp do danych z mojej bazy danych, ale rozważam utworzenie dostawcy treści. Wydaje mi się, że podejście URI do żądania danych jest jasne i zwięzłe. Z drugiej strony, czy używanie dostawcy zawartości tylko dla mojej aplikacji będzie zbędne (ponieważ w nim będę miał klasę SQliteOpenHelper) i będzie wymagało więcej pracy niż potrzebuję?

Pzanno
źródło
2
Stworzyłem bibliotekę, aby ułatwić pisanie dostawcy treści. Nawet łatwiejsze niż pisanie zwykłego SQLiteOpenHelper. github.com/coocood/VContentProvider
coocood

Odpowiedzi:

59

Jeśli nie planujesz udostępniać danych, nie myśl o dostawcach treści. Są potężne, ale trudne do napisania, a ich wdrożenie będzie po prostu głupie, jeśli zamierzasz ich używać wewnętrznie.

Zastanawiam się jednak, czy ktoś myśli o tym, aby dostawca treści używał tylko w swojej własnej aplikacji.

Oczywiście ... na przykład w przypadku starej aplikacji listy zadań do wykonania, którą napisałem, musiałem napisać dostawcę treści, aby umożliwić innym aplikacjom pobieranie i dostęp do stanów zadań. To była część wymagań, ale co więcej, miało to sens i sprawiło, że aplikacja była ładniejsza.

Cristian
źródło
35
Zgadzam się z twoim uzasadnieniem, ale uważam też, że ważne (szczególnie dla początkujących) jest to, że po wdrożeniu dostawcy treści uzyskasz wiele korzyści. Na przykład, możesz użyć CursorLoaderdo wykonywania zapytań asynchronicznych ... masz dostęp do pojedynczej instancji (the ContentResolver) do wykonywania zapytań itp. Oczywiście możesz zaimplementować własny Loader do użycia w bazie danych SQLite ... oczywiście może zaimplementować dostęp do pojedynczej instancji bazy danych w całej aplikacji ... i oczywiście ContentProvider nie jest wymagany, chyba że chcesz to udostępnić
Alex Lockwood
12
dane z innymi aplikacjami. To powiedziawszy, istnieje wiele korzyści związanych z wdrożeniem własnego dostawcy treści, więc nie należy go odrzucać tylko dlatego, że aplikacja nie udostępnia swoich danych.
Alex Lockwood
8
Tak, masz całkowitą rację, ale nadal uważam, że w większości przypadków nie jest to warte wysiłku. Zrobiłem co najmniej 12 różnych aplikacji na Androida (opublikowanych w Sklepie Play) i nigdy nie potrzebowałem ContentProvider. W rzeczywistości ostatnia aplikacja, nad którą pracowaliśmy, została początkowo utworzona za pomocą a ContentProvideri właśnie ją usunęliśmy, ponieważ korzystanie z niej jest bardziej uciążliwe niż powinno (napisałem nawet bibliotekę, aby ułatwić implementację podstawowych ContentProviders: github.com/casidiablo/persistence, ale nigdy nie korzystałem z niego samodzielnie XD).
Cristian
1
@Cristian zapewnia najbardziej praktyczne porady. Nawet dokument Androida stwierdza, że ​​nie powinniśmy używać, ContentProviderjeśli nie musimy - „Nie potrzebujesz dostawcy do korzystania z baz danych lub innych rodzajów trwałej pamięci masowej, jeśli użycie odbywa się całkowicie w ramach Twojej własnej aplikacji i nie potrzebujesz dowolna z funkcji wymienionych powyżej. Zamiast tego możesz użyć jednego z systemów przechowywania opisanych na stronie Zapisywanie danych aplikacji. ”. W przeciwnym razie jesteśmy po prostu za inżynierią.
Cheok Yan Cheng
Podsumowanie: jeśli nie planujesz udostępniać swoich danych, możesz uniknąć dostawcy treści, ale z drugiej strony dostawca treści ułatwia życie, jeśli chcesz zmienić bazę danych aplikacji. np. z SQLite do MangoDB.
Prashant
117

Twierdzę, że zdecydowanie dobrym pomysłem jest użycie ContentProvidernawet, jeśli nie zamierzasz upubliczniać go.

Dobrą praktyką jest zapewnienie dodatkowego poziomu abstrakcji danych, aby ułatwić wewnętrzne zmiany. Co się stanie, jeśli później zdecydujesz się zmienić podstawową strukturę bazy danych? Jeśli używasz a ContentProvider, możesz zawrzeć w nim wszystkie zmiany strukturalne, gdzie jakbyś ich nie używał, jesteś zmuszony do zmiany wszystkich obszarów kodu, na które wpływają zmiany strukturalne. Poza tym miło jest móc ponownie używać tego samego standardowego interfejsu API do uzyskiwania dostępu do danych zamiast zaśmiecać kod niskopoziomowym dostępem do bazy danych.

Ponadto zawsze istnieje możliwość, że będziesz chciał ujawnić swoje dane w przyszłości. Jeśli nie użyjesz ContentProviderprzedniej części, znacznie trudniej będzie ją zamontować w późniejszym terminie.

Następnie są inne części Androida, w których ContentProvidersą wymagane / zalecane, na przykład podczas używania SyncAdapters i jeśli chcesz mieć widżet aplikacji, który obejmuje na przykład dostęp do danych.

Podsumowując, pisanie z ContentProvidergóry wiąże się z niewielkim nakładem pracy (kiedy już nauczyłeś się API, co i tak jest dobrym pomysłem), więc ma to sens, nawet w przypadku danych prywatnych.

Paul Drummond
źródło
1
Nie mogłem się bardziej zgodzić. Zmusza cię to do abstrakcji warstwy danych w sposób, który praktycznie gwarantuje, że nowy programista nie będzie w stanie połączyć z nią interfejsu użytkownika.
Gabriel
3
Zaraz po nauce Androida zacząłem myśleć dokładnie w ten sam sposób, właśnie z tego powodu. Nawet jeśli nie są publiczne, zawsze możesz skorzystać ze zwiększonej abstrakcji i pojedynczego punktu realizacji decyzji architektonicznych. Uwielbiam ContentProviders.
davidcsb
2
Za pomocą tego atrybutu możesz udostępnić dostawcę treści tylko dla swojej własnej aplikacji:android:exported="false"
Toby 1 Kenobi,
4
Moim skromnym zdaniem możesz i powinieneś obsługiwać swoje dane w sposób całkowicie abstrakcyjny, bez konieczności implementacji ContentProvider.
hmartinezd
2
Kiedy byłem na mojej drodze implementacji rozwiązania dostarczającego treści dla mojej wewnętrznej bazy danych sqlite (brak interakcji z innymi aplikacjami), zobaczyłem uwagę na developer.android.com/guide/topics/providers/ ... która stwierdza, że nie potrzebujesz dostawcy używać bazy danych SQLite, jeśli jest to całkowicie w ramach Twojej własnej aplikacji.
Selçuk Cihan
7

Spójrz na MOTODEV Studio dla Eclipse. Jest to środowisko programistyczne, które rozszerza Eclipse. Mają narzędzie, za pomocą którego można automatycznie generować dostawcę treści dla bazy danych. Jeśli dostawca treści ułatwia dostęp do danych i nie ma to znaczącego wpływu na wydajność, używaj ich. W większości scenariuszy tak będzie.

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
źródło
5

Krótko mówiąc, Content Providerspomaga w efektywnym zarządzaniu danymi . Sugerowałbym użycie ich z następujących powodów.

  • Działa jako warstwa abstrakcji między interfejsem użytkownika a bazą danych . Możesz zaimplementować walidację danych w ContentProviders, aby sprawdzić poprawność danych wprowadzonych przez użytkownika. Pozwala także modyfikować strukturę bazy danych bez dotykania interfejsu użytkownika i innych części.
  • Dobrze współgrają z innymi klasami platform Android, takimi jak SyncAdapter. Na przykład możesz automatycznie odświeżyć listę, gdy wartość w bazie danych zmieni się za pomocą ContentProviders wraz z CursorLoader. Bez ContentProviderów musisz samodzielnie zaimplementować wiele takich funkcjonalności.
  • Możemy bezpiecznie udostępniać nasze prywatne dane innym aplikacjom . Korzystanie z ContentProviders pozwoli nam łatwo i bezpiecznie udostępniać nasze dane innym aplikacjom.

Więc nawet jeśli nie potrzebujesz teraz żadnej z tych funkcji, możesz potrzebować ich w przyszłości i dobrze jest pójść o krok dalej i wdrożyć je teraz.

Siva Prakash
źródło
Świetna odpowiedź. Opis w jednym zdaniu ContentProvidersi trzy oddzielne powody, dla których powinniśmy ich używać. Czasami proste wyjaśnienia są najlepsze. +1
AdamInTheOculus
4

Zgadzam się, że ContentProviders są trochę trudne do zrozumienia, ale są zdecydowanie pomocne, nawet jeśli chcesz używać ich wewnętrznie we własnej aplikacji. Najlepsze jest to, że możesz dostosować dostawców treści pod kątem odpowiednich identyfikatorów URI.

Oto scenariusz, w którym możesz mieć 5 tabel w swojej bazie danych, ale przed użyciem musisz połączyć kilka z nich w określonych zamówieniach. I utwórz identyfikator URI treści dla każdego z tych połączeń. Możesz wtedy użyć tych identyfikatorów URI jako tabeli :)

Sugeruję, abyś poszedł dalej z dostawcą treści, będziesz zaskoczony, jak potężny jest.

Shubhayu
źródło
2

Z mojego punktu widzenia dostawca treści ma wiele zalet, pozostawiając w spokoju tylko udostępnianie danych innym aplikacjom. Jeśli musisz zsynchronizować się z serwerem za pomocą adaptera synchronizacji, użyj wiadomości w chmurze Google, automatycznie zaktualizuj interfejs użytkownika, gdy podstawowe dane w bazie danych zmienią się za pomocą programów ładujących, zaimplementuj wyszukiwanie, użyj widżetów ... wtedy dostawca treści jest dla Ciebie.

Wolę, abyś postępował zgodnie z wytycznymi, ponieważ pewnego dnia być może będziesz musiał zaimplementować niektóre z powyższych funkcji dołączonych do dostawcy treści

Nawiasem mówiąc, możesz szybko zbudować bazę danych i CP w mniej niż 5 minut za pomocą generatora dostawców treści

Phillip Kigenyi
źródło
1

Jak wspomniano w dokumentacji: Tworzenie dostawcy treści

Nie potrzebujesz dostawcy do korzystania z bazy danych SQLite, jeśli użycie odbywa się całkowicie w ramach Twojej własnej aplikacji.

Po co więc zawracać sobie głowę rozwijaniem tego narzutu? Chcesz łatwiejszego i szybszego rozwoju, prawda? Zatem wystarczy jedna warstwa abstrakcji (potomek SQLiteOpenHelper).

Zobacz Brzytwa Ockhama Nie twórz bytów bez dobrego powodu.

stoarch
źródło
0

Nie używaj dostawcy treści, jeśli nie chcesz udostępniać danych innym aplikacjom. Użyj prostej bazy danych sqlitedatabase do wykonywania operacji na bazie danych. Zachowaj ostrożność podczas korzystania z dostawców treści do przechowywania poufnych danych, ponieważ inne aplikacje mogą uzyskać dostęp do Twoich poufnych informacji

user3030895
źródło
Domyślnie dostawcy zawartości nie są ujawnieni, a zarządzanie ograniczeniami dostępu do nich jest łatwe. Głosuj przeciw rozpowszechnianiu dezinformacji.
TBridges42
2
@ TBridges42 Mylisz się (myliłeś). W rzeczywistości aż do ujawnienia dostawców zawartości API poziomu 17 . Do czasu udzielenia odpowiedzi to zachowanie miało wpływ na 25% urządzeń z Androidem i nadal 10% w momencie komentowania . Tak więc jest bardziej na odwrót: twój komentarz jest niebezpieczny, ponieważ stwierdzasz, że coś ma być bezpieczne, co nie jest faktem / nie było.
Murmel
0

Korzystanie z dostawcy treści może pomóc w uzyskaniu dodatkowego poziomu abstrakcji - umieszczenie go we własnej aplikacji znacznie wydłuża czas tworzenia projektu. Jeśli jednak używasz go do udostępniania danych, ustawień aplikacji lub konfiguracji w wielu aplikacjach, wybór należy do dostawcy treści.

Obserwuj swoje poziomy bezpieczeństwa, a polecam użycie SQLcipher do szyfrowania danych podczas resetowania (DAR), jeśli Twój dostawca treści pisze do SQLite. (Korzystałem z dostawcy treści w kilku rozwiązaniach i zapewniłem możliwość wykonania na żywo „migawki” wartości operacyjnych do debugowania i testowania).

Jim Row
źródło