Dlaczego stworzono ContentProvider dla Androida?

11

Tytuł stanowi podsumowanie mojego pytania, ale aby wyjaśnić w zasadzie to, co chcę zrozumieć, dlaczego projektanci Androida chcą, aby aplikacje, które muszą współpracować z udostępnionymi danymi, korzystały z dostawcy treści, a nie tylko bezpośrednio uzyskiwały dostęp do bazy danych SQLite?

Jedynym powodem, dla którego mogę myśleć o bezpieczeństwie, jest to, że do niektórych plików można uzyskać dostęp tylko z określonych procesów iw ten sposób dostawca treści jest strażnikiem, który zapewnia każdej aplikacji odpowiednie uprawnienia przed zezwoleniem na odczyt i / lub zapis do pliku bazy danych. Czy to jest główny powód, dla którego utworzono ContentProvider?

satur9nine
źródło

Odpowiedzi:

6

Jest to przede wszystkim sposób izolowania danych i konsumentów danych. Opracowujesz własnego dostawcę treści lub rozszerzasz istniejącego, jeśli chcesz upublicznić niektóre dane lub przynajmniej udostępnić je innym aplikacjom.

To prawda, że ​​serwer może kontrolować dostęp z punktu widzenia bezpieczeństwa, ale umożliwia także przerobienie fizycznej implementacji danych w dowolnym momencie. W takim przypadku wystarczy dostosować zaplecze dostawcy treści. Aplikacje konsumenckie danych nie będą musiały być przepisywane. Będą nadal uzyskiwać dostęp do twoich danych za pośrednictwem usługi rozpoznawania treści, nieświadomi żadnych zmian w faktycznej implementacji.

Ponadto system Android utworzy tylko jedną instancję dostawcy treści, nawet jeśli dostęp do danych ma kilku klientów, więc zajmie się dostępem równoległym bez konieczności dbania o to.

Wreszcie, wierzę, że poradzi sobie również z harówką czystego rozruchu i wyłączania.

Alain Pannetier
źródło
1
Myślę, że izolacja jest prawdopodobnie najlepszą odpowiedzią. Nie zgadzam się z twoją opinią na temat równoczesnego dostępu, SQLite i interfejs Java Java Androida obsługują współbieżność, sam ContentProvider pozwala wielu wątkom jednocześnie wysyłać zapytania / wstawiać / aktualizować, więc tak naprawdę nic dla ciebie nie robi.
satur9nine
3

Wyodrębnia ContentProviderrównież całą komunikację między procesami, która jest wymagana do komunikacji z aplikacjami innych firm. Konieczność samodzielnego napisania tego kodu byłaby ogromnym bólem.

Alex Lockwood
źródło
Firmy zewnętrzne zawsze mogły bezpośrednio uzyskać dostęp do pliku bazy danych, nie wymagając komunikacji między procesami.
satur9nine
Nie jestem pewien, co masz na myśli ... jeśli aplikacja jest „stroną trzecią”, to z definicji musi istnieć w innym procesie (ponieważ każda aplikacja na Androida ma swój własny proces główny). Również jeśli system operacyjny Android umożliwiłby ci bezpośredni dostęp do surowych magazynów danych innych aplikacji, spowodowałoby to poważne problemy z bezpieczeństwem.
Alex Lockwood
1

ContentProvider to także abstrakcja, która ukrywa szczegóły dotyczące sposobu przechowywania / generowania danych. Na przykład w jednej z moich aplikacji mam dostawcę treści, który zwraca obrazy PNG. Te obrazy nie są nigdzie przechowywane, są generowane na żądanie.

Dan Dyer
źródło