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,
- Jaka jest dokładna różnica między „dostawcą treści” a „bazą danych SQLite”?
- Kiedy najlepiej przechowywać dane?
Jakikolwiek przykład lub pomoc !!
źródło
ContentProvider
to 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ć.Nie można na to odpowiedzieć abstrakcyjnie. Ogólnie rzecz biorąc, jeśli coś nie wymaga
ContentProvider
użycia bazy danych, po prostu użyj bazy danych.źródło
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.
źródło
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.
źródło
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
źródło
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
źródło
Przeczytałem tę odpowiedź , szukając tych samych wątpliwości, więc pomyśl o podzieleniu się nią. w Stanach -
Dlatego dobrym pomysłem byłoby skorzystanie z dostawcy treści.
źródło
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.
źródło
Jedna różnica polega na tym, że dostawcy treści obsługują platformę dla obserwatorów treści. Będziesz musiał zaimplementować swój własny obserwowalny wzorzec dla bazy danych SQLite.
Jak automatycznie przesyłać zapytania za pomocą LoaderManager
ContentObserver dla SQLite?
źródło