Dokładna różnica między „Content-Provider” a „SQLite Database”

87

Zrobiłem programowanie baz danych SQLite dla Androida, ale nie wiem nic o Content-Provider poza tym: „Jak już wspomniałem na stronie Android Developer , Android SDK wyjaśnił, że„ Content-provider ”jest używany do przechowywania i pobierania danych.”

Ale wtedy,

  1. Jaka jest dokładna różnica między „dostawcą treści” a „bazą danych SQLite”?
  2. Kiedy najlepiej przechowywać dane?

Jakikolwiek przykład lub pomoc !!

Paresh Mayani
źródło

Odpowiedzi:

134

Znalazłem jedną zasadniczą różnicę, jak następuje:

Przechowywanie danych w bazie danych to dobry sposób na utrwalenie danych , ale istnieje zastrzeżenie dotyczące baz danych utworzonych w systemie Android, które dotyczą visibletylko aplikacji, która je utworzyła. Oznacza to, że baza danych SQLite utworzona w systemie Android przez jedną aplikację może być używana tylko przez tę aplikację, a nie przez inne aplikacje.

Tak więc, jeśli ty need to share data between applications, you need to use the content provider model as recommended in Android.Ten artykuł przedstawia podstawy dostawców treści i sposoby ich wdrożenia.

Znalazłem ten artykuł pod tym linkiem

Dostarczono naprawdę miłe informacje.

Paresh Mayani
źródło
2
Wygląda na to, że link jest teraz martwy ... nie oglądaj już tego artykułu. Chciałby zobaczyć artykuł, do którego się odnosisz, jeśli znajdziesz go ponownie.
prolink007
11 lutego 2012 działa link http://www.devx.com/wireless/Article/41133 ,
k3b
A co, jeśli zapewnimy mechanizmy w procesie udostępniania danych w wielu aplikacjach w sposób bezpieczny dla wątków?
Manohar,
2
Kolejną dodatkową zaletą jest to, że dostawcy treści używają jednego wątku dla każdej operacji, więc wiele wątków nie może modyfikować bazy danych, jak w przypadku sqlite
Rat-a-tat-a-tat Ratatouille
54

Jaka jest dokładna różnica między „dostawcą treści” a „bazą danych SQLite”?

ContentProviderto fasada - API, które możesz zaimplementować, które udostępnia bazy danych innym procesom. To może być realizowane w sposób, w którym dane są przechowywane w bazie danych SQLite, ale nie musi być.

Kiedy najlepiej przechowywać dane?

Nie można na to odpowiedzieć abstrakcyjnie. Ogólnie rzecz biorąc, jeśli coś nie wymaga ContentProviderużycia bazy danych, po prostu użyj bazy danych.

CommonsWare
źródło
26
Wolę używać ContentProvider, ponieważ jest to bardzo ładna abstrakcja w stosunku do SQL. Możesz także grać dobrze z CursorAdapter i automatycznymi zapytaniami.
alexanderblom
26

Stworzyłem wiele dobrych aplikacji z tysiącami użytkowników korzystających z nich, które po prostu używały metod SQLite. Ale to było jakiś czas temu i musiałem ręcznie napisać dużo kodu, którym teraz z łatwością może zająć się ContentProvider. Wtedy nie byłem zwolennikiem korzystania z dostawców treści, ponieważ wydawało się, że tylko dodają złożoność w kodzie.

Jednak w ciągu ostatnich kilku lat, wraz z ewolucją Androida, przeniosłem się na ContentProvider, ponieważ oszczędza czas i pozwala zrobić więcej. Teraz intensywnie go używam. Gdy masz już napisaną klasę dostawcy treści, Twoje życie stanie się znacznie łatwiejsze. Z ContentProvider bardzo łatwo radzę sobie z programami ładującymi kursor, wywołania zwrotne modułu ładującego i wstawkami zbiorczymi, dla których musiałem pisać wszystko ręcznie w przeszłości, a mimo to nie działało tak wydajnie. Zwłaszcza podczas aktualizacji widoku listy, który jest teraz aktualizowany automatycznie dzięki tylko jednej metodzie notifychange (). Oznacza to, że nie muszę teraz wpisywać własnych detektorów i ręcznie aktualizować treści w widokach list i adapterach. Ponadto nie muszę martwić się otwieraniem i zamykaniem baz danych ani wyciekami pamięci. Tym wszystkim zajmuje się dostawca treści. Jedynym problemem, z którym od czasu do czasu się spotykam, jest to, że nie można wykonywać złożonych zapytań w ContentProviders. W takim przypadku nadal możesz używać nieprzetworzonych zapytań i staromodnej ręcznej interakcji z sqlite.

Jeśli wcześniej napisałeś własne DbAdapter, Helper i Observer, możesz bezpiecznie przenieść je do nowych aplikacji bez tracenia czasu na konwersję wszystkiego do ContentProvider. Jednak na podstawie mojego doświadczenia gorąco polecam przejście na ContentProvider. Przyzwyczajenie się do tego zajmie trochę czasu, ale gdy zdobędziesz z tym doświadczenie, zostaniesz z tym.

UPDATE 2017 Przerzuciłem się na Realm , znacznie lepszy sposób korzystania z baz danych na dowolnej platformie. Poświęć kilka godzin na naukę i zaoszczędź niezliczone godziny w swojej karierze związanej z tworzeniem aplikacji.

zeeshan
źródło
Myślałem o przekonwertowaniu mojego kodu na dostawcę treści, ale teraz myślę o tym, aby go zatrzymać.
Mohammed Subhi Sheikh Quroush
Teraz możesz także dodać bibliotekę „Room” systemu Android
Ravindra Kushwaha,
8

1. Dostawcy treści nie są bezpieczni wątkowo

Domyślnie dostawcy zawartości nie są bezpieczni wątkowo. Jeśli masz wiele wątków korzystających z dostawcy zawartości, możesz zobaczyć wiele różnych wyjątków i innych niespójności danych. Najłatwiejszym sposobem rozwiązania tego problemu jest użycie słowa kluczowego synchronized w każdej z metod publicznych udostępnianych przez dostawcę zawartości.

W ten sposób tylko jeden wątek naraz może uzyskać dostęp do tych metod.

2. Baw się dobrze, robiąc dużo tekstów

W nowej aplikacji Serval Maps mam potrzebę importowania danych z plików binarnych do bazy danych używanej wewnętrznie przez aplikację. Aby to zrobić i dobrze bawić się resztą aplikacji, najlepiej:

Stwórz nowy wątek, który podejmie import, aby nie wpływać niekorzystnie na inne wątki, w szczególności wątek odpowiedzialny za aktualizację interfejsu użytkownika; i Wstrzymaj na chwilę na końcu każdego importu, aby dać innym wątkom, które muszą używać zsynchronizowanych metod, większe szanse.

3. Dostawcy treści zmuszają Cię czasem do myślenia bocznego

Sposób, w jaki działają dostawcy zawartości w systemie Android, polega na zapewnieniu warstwy abstrakcji między resztą kodu a podstawową bazą danych. Wynika to głównie z faktu, o ile wiem, że dostawcy treści mają dostęp do danych z innych miejsc niż bazy danych.

Oznacza to, że nie można wykonywać surowych zapytań SQL w bazowej bazie danych i trzeba określić różne składniki zapytania SQL za pomocą zmiennych przekazywanych do różnych metod, takich jak metoda zapytania. Jeśli masz zadanie, które nie pasuje do sposobu, w jaki SQL jest obsługiwany przez dostawcę treści, masz dwie możliwości:

Pomyśl z boku o zapytaniu, być może możesz uzyskać potrzebne dane za pomocą alternatywnych zapytań i dostępu do wyników za pomocą kursora; i Użyj identyfikatora URI do normalnego uzyskiwania dostępu do danych oraz specjalnego identyfikatora URI, który jest dopasowany do określonego zapytania dla tych zadań, które nie mają alternatyw.

chanu
źródło
zgodnie z ContentProvider sześć abstrakcyjnych metod ContentProvider, które muszą być zaimplementowane, może być wywoływanych przez wiele wątków jednocześnie, więc muszą być implementowane jako bezpieczne wątkowo. Klasa abstrakcyjna ContentProvider nie jest powodem wyjątków konkretnego kodu, ale implementacją. Postępuj zgodnie z procesami i wątkami, aby zaimplementować bezpieczne wątkowo metody ContentProvider.
StahlRat
5

Dostawcy treści są wykorzystywani, gdy chcesz udostępniać dane między aplikacjami.

Jeśli masz bazę danych dołączoną do aplikacji i chcesz, aby inna aplikacja korzystała z niektórych danych, możesz zaimplementować dostawcę zawartości, który ujawnia dane

Mina Samy
źródło
3

Główna różnica polega na tym, że gdy Twoja aplikacja musi udostępniać informacje innym aplikacjom, użyj dostawcy treści. SQLite przechowuje tylko dane aplikacji, która je utworzyła

Daniel Uribe
źródło
3

Przeczytałem tę odpowiedź , szukając tych samych wątpliwości, więc pomyśl o podzieleniu się nią. w Stanach -

Dobrą praktyką jest zapewnienie dodatkowego poziomu abstrakcji danych, aby ułatwić ich wewnętrzną zmianę. Co się stanie, jeśli później zdecydujesz się zmienić podstawową strukturę bazy danych? Jeśli używasz ContentProvider, możesz zawrzeć w nim wszystkie zmiany strukturalne, gdzie jakbyś ich nie używał, jesteś zmuszony zmienić wszystkie obszary 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.

Dlatego dobrym pomysłem byłoby skorzystanie z dostawcy treści.

Darpan
źródło
3

Pomyśl o zaawansowanych systemach zarządzania treścią. Każdy obiekt (strona, obraz, artykuł z wiadomościami, element wydarzenia itp.) Ma treść, adres, uprawnienia użytkownika i sposoby interakcji z nim z różnych części systemu. Dostawcy treści robią to dla Androida. Możesz teraz udostępniać pliki lub obrazy zapisane w aplikacji. Możesz także tworzyć niestandardowe obiekty, które można udostępniać, takie jak kontakty biznesowe, edytowalne notatki itp. Oraz określić zabezpieczenia i domyślną aplikację do obsługi takich obiektów, gdy otwierasz je z dowolnej innej aplikacji.

Roberto
źródło