Wann wird ein Inhaltsanbieter verwendet?

103

Ich verstehe, dass Inhaltsanbieter den öffentlichen Datenaustausch zwischen Anwendungen ermöglichen. Ich frage mich jedoch, ob jemand darüber nachdenkt, einen Inhaltsanbieter nur für Ihre eigene App zu verwenden. Wäre dies von Vorteil? Irgendwelche Nachteile?

In der Vergangenheit habe ich gerade den SQliteOpenHelper implementiert, um auf Daten aus meiner Datenbank zuzugreifen, aber ich denke darüber nach, einen Inhaltsanbieter zu erstellen. Ich bin der Meinung, dass der URI-Ansatz zum Anfordern von Daten klar und präzise ist. Wird die Verwendung eines Inhaltsanbieters nur für meine Anwendung redundant sein (da ich darin eine SQliteOpenHelper-Klasse habe) und mehr Arbeit als nötig?

Pzanno
quelle
2
Ich habe eine Bibliothek erstellt, um das Schreiben von Inhaltsanbietern zu vereinfachen. Noch einfacher als einfaches SQLiteOpenHelper zu schreiben. github.com/coocood/VContentProvider
coocood

Antworten:

59

Wenn Sie keine Datenfreigabe planen, denken Sie nicht an Inhaltsanbieter. Sie sind mächtig, aber schwer zu schreiben, und es ist einfach albern, sie zu implementieren, wenn Sie sie intern verwenden.

Ich frage mich jedoch, ob jemand darüber nachdenkt, einen Inhaltsanbieter nur für Ihre eigene App zu verwenden.

Natürlich ... zum Beispiel musste ich für eine alte TODO-Listen-App, die ich geschrieben habe, einen Inhaltsanbieter schreiben, damit andere Apps die Aufgabenstatus abrufen und darauf zugreifen können. Es war Teil der Anforderungen, aber darüber hinaus machte es Sinn und machte die App schöner.

Cristian
quelle
34
Ich stimme Ihrer Rechtfertigung zu, aber ich denke auch, dass es wichtig ist (insbesondere für Anfänger), dass Sie nach der Implementierung des Inhaltsanbieters viele Vorteile erhalten. Zum Beispiel können Sie das verwenden CursorLoader, um asynchrone Abfragen auszuführen ... Sie haben Zugriff auf eine Singleton-Instanz (die ContentResolver), um Abfragen usw. auszuführen. Natürlich können Sie Ihren eigenen Loader implementieren, der für Ihre SQLite-Datenbank verwendet wird ... natürlich Sie könnte den Zugriff auf eine einzelne Datenbankinstanz in der gesamten Anwendung implementieren ... und natürlich ist ein ContentProvider nicht erforderlich, es sei denn, Sie möchten ihn freigeben
Alex Lockwood
11
Daten mit anderen Apps. Die Implementierung Ihres eigenen Inhaltsanbieters bietet jedoch viele Vorteile. Sie sollten ihn daher nicht außer Betracht lassen, nur weil Ihre App seine Daten nicht gemeinsam nutzt.
Alex Lockwood
8
Ja, Sie haben vollkommen recht, aber ich denke immer noch, dass sich die Mühe in den meisten Fällen nicht lohnt. Ich habe mindestens 12 verschiedene Android-Apps (im Play Store veröffentlicht) erstellt und brauche nie eine ContentProvider. Tatsächlich wurde die letzte App, an der wir gearbeitet haben, ursprünglich mit a erstellt ContentProviderund wir haben sie nur gelöscht, da es eigentlich mehr nervt, sie zu benutzen, als sie sollte (ich habe sogar eine Bibliothek geschrieben, um die Implementierung grundlegender ContentProviders zu vereinfachen : github.com/casidiablo/persistence hatte es aber nie selbst benutzt XD).
Cristian
1
@Cristian bietet die meisten praktischen Ratschläge. Selbst in Android-Dokumenten heißt es, dass wir nicht verwenden sollten, ContentProviderwenn wir nicht müssen - "Sie benötigen keinen Anbieter, um Datenbanken oder andere Arten von persistentem Speicher zu verwenden, wenn die Verwendung vollständig in Ihrer eigenen Anwendung erfolgt und Sie nicht benötigen eine der oben aufgeführten Funktionen. Stattdessen können Sie eines der auf der Seite Speichern von App-Daten beschriebenen Speichersysteme verwenden. " Ansonsten sind wir gerade über Engineering.
Cheok Yan Cheng
Zusammenfassung: Wenn Sie nicht vorhaben, Ihre Daten freizugeben, können Sie den Inhaltsanbieter vermeiden. Der Inhaltsanbieter erleichtert Ihnen jedoch das Leben, wenn Sie die Datenbank Ihrer App ändern möchten. zB von SQLite zu MangoDB.
Prashant
116

Ich würde behaupten, es ist definitiv eine gute Idee, ein zu verwenden, ContentProviderauch wenn Sie nicht beabsichtigen, es öffentlich zu machen.

Es wird empfohlen, die zusätzliche Abstraktionsebene für Ihre Daten bereitzustellen, um interne Änderungen zu vereinfachen. Was ist, wenn Sie die zugrunde liegende Datenbankstruktur zu einem späteren Zeitpunkt ändern möchten? Wenn Sie eine verwendenContentProvider , können Sie alle strukturellen Änderungen darin enthalten. Wenn Sie keine verwenden, müssen Sie alle Bereiche des Codes ändern, die von den strukturellen Änderungen betroffen sind. Außerdem ist es schön, dieselbe Standard-API für den Zugriff auf Daten wiederverwenden zu können, anstatt Ihren Code mit einem einfachen Zugriff auf die Datenbank zu verschmutzen.

Außerdem besteht immer die Möglichkeit, dass Sie Ihre Daten in Zukunft verfügbar machen möchten. Wenn Sie kein ContentProviderFront-Up verwenden, ist es viel schwieriger, es zu einem späteren Zeitpunkt nachzurüsten.

Dann gibt es die anderen Teile von Android, in denen ContentProviders erforderlich / empfohlen sind, z. B. bei Verwendung von SyncAdapters und wenn Sie ein App-Widget möchten, das beispielsweise Datenzugriff beinhaltet.

Zusammenfassend lässt sich sagen, dass das Schreiben einer Vorabversion nur sehr wenig Aufwand ContentProvidererfordert (sobald Sie die API kennengelernt haben, was ohnehin eine gute Idee ist). Daher ist dies auch für private Daten sinnvoll.

Paul Drummond
quelle
1
Ich konnte nicht mehr zustimmen. Es zwingt Sie, Ihre Datenschicht so zu abstrahieren, dass praktisch sichergestellt ist, dass ein neuer Entwickler die Benutzeroberfläche nicht damit koppeln kann.
Gabriel
3
Unmittelbar nach dem Erlernen von Android begann ich genau aus diesem Grund genauso zu denken. Auch wenn Sie nicht öffentlich sind, können Sie immer von der erhöhten Abstraktion und dem zentralen Punkt der Umsetzung Ihrer Architekturentscheidungen profitieren. Ich liebe ContentProviders.
Davidcsb
1
Sie können den Inhaltsanbieter nur für Ihre eigene Anwendung mit diesem Attribut verfügbar machen:android:exported="false"
Toby 1 Kenobi
4
Meiner bescheidenen Meinung nach können und sollten Sie Ihre Daten vollständig abstrahiert behandeln, ohne ContentProvider implementieren zu müssen.
Hmartinezd
2
Als ich unterwegs war, um eine Contentprovider-Lösung für meine interne SQLite-Datenbank zu implementieren (keine Interaktion mit anderen Apps), sah ich die Bemerkung auf developer.android.com/guide/topics/providers/…, die besagt, dass Sie keinen Provider benötigen Verwenden einer SQLite-Datenbank, wenn die Verwendung vollständig in Ihrer eigenen Anwendung erfolgt.
Selçuk Cihan
7

Schauen Sie sich das MOTODEV Studio für Eclipse an. Es ist eine Entwicklungsumgebung, die Eclipse erweitert. Sie haben ein Tool, mit dem Sie automatisch einen Inhaltsanbieter für eine Datenbank generieren können. Wenn ein Inhaltsanbieter den Zugriff auf Ihre Daten erleichtert und dies keinen wesentlichen Einfluss auf die Leistung hat, verwenden Sie diese. In den meisten Szenarien ist dies der Fall.

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
quelle
5

Kurz gesagt, Content Providershilft bei der effektiven Verwaltung Ihrer Daten . Ich würde vorschlagen, sie aus den folgenden Gründen zu verwenden.

  • Es fungiert als Abstraktionsschicht zwischen Ihrer Benutzeroberfläche und der Datenbank . Sie können die Datenüberprüfung in ContentProviders implementieren, um die vom Benutzer eingegebenen Daten zu überprüfen. Außerdem können Sie die Struktur der Datenbank ändern, ohne die Benutzeroberfläche und andere Teile zu berühren.
  • Sie spielen gut mit anderen Android-Framework-Klassen wie SyncAdapter. Beispielsweise können Sie eine Liste automatisch aktualisieren, wenn sich ein Wert in einer Datenbank mithilfe von ContentProvidern zusammen mit ändert CursorLoader. Ohne ContentProvider müssen Sie viele dieser Funktionen selbst implementieren.
  • Wir können unsere privaten Daten sicher anderen Apps aussetzen . Durch die Verwendung von ContentProvidern können wir unsere Daten einfach und sicher mit anderen Apps teilen.

Selbst wenn Sie jetzt keine dieser Funktionen benötigen, benötigen Sie sie möglicherweise in Zukunft, und es ist gut, die Extrameile zu gehen und sie jetzt zu implementieren.

Siva Prakash
quelle
Gute Antwort. Einzelne Satzbeschreibung ContentProvidersund drei verschiedene Gründe, warum wir sie verwenden sollten. Manchmal sind die einfachen Erklärungen die besten. +1
AdamInTheOculus
4

Ich bin damit einverstanden, dass ContentProvider etwas schwer zu verstehen sind, aber sie sind auf jeden Fall hilfreich, selbst wenn Sie sie intern für Ihre eigene App verwenden möchten. Das Beste daran ist, dass Sie die Inhaltsanbieter für geeignete URIs anpassen können.

In diesem Szenario haben Sie möglicherweise 5 Tabellen in Ihrer Datenbank, aber Sie müssen einige davon in bestimmten Reihenfolgen verknüpfen, bevor Sie sie verwenden können. Erstellen Sie für jede dieser Verknüpfungen eine Inhalts-URI. Sie können diese URIs dann jeweils als Tabelle verwenden :)

Ich schlage vor, Sie fahren mit Content Provider fort. Sie werden erstaunt sein, wie leistungsfähig es ist.

Shubhayu
quelle
2

Meiner Ansicht nach bietet der Inhaltsanbieter viele Vorteile, ganz zu schweigen davon, dass er nur Daten mit anderen Apps teilt. Wenn Sie mithilfe eines Synchronisierungsadapters mit dem Server synchronisieren müssen, Google Cloud Messaging verwenden, die Benutzeroberfläche automatisch aktualisieren müssen, wenn sich die zugrunde liegenden Daten in der Datenbank mithilfe von Loadern ändern, die Suche implementieren, Widgets verwenden ... dann ist der Inhaltsanbieter für Sie.

Ich bevorzuge, dass Sie die Richtlinie befolgen, da Sie eines Tages möglicherweise einige der oben genannten Funktionen implementieren müssen, die an den Inhaltsanbieter angehängt sind

Übrigens können Sie Ihre Datenbank und Ihren CP mit dem Content Provider Generator schnell in weniger als 5 Minuten erstellen

Phillip Kigenyi
quelle
1

Wie in der Dokumentation beschrieben: Erstellen eines Inhaltsanbieters

Sie benötigen keinen Anbieter, um eine SQLite-Datenbank zu verwenden, wenn die Verwendung vollständig in Ihrer eigenen Anwendung erfolgt.

Warum also diesen Overhead entwickeln? Sie wollen eine einfachere und schnellere Entwicklung, oder? Eine Abstraktionsebene (SQLiteOpenHelper-Nachkomme) reicht also aus.

Siehe Occams Rasiermesser Machen Sie keine Entitäten ohne guten Grund.

Stoarch
quelle
0

Verwenden Sie keinen Inhaltsanbieter, wenn Sie keine Daten mit anderen Apps teilen möchten. Verwenden Sie die einfache sqlitedatabase, um Datenbankoperationen auszuführen. Seien Sie vorsichtig, wenn Sie Inhaltsanbieter zum Speichern vertraulicher Daten verwenden, da andere Apps möglicherweise auf Ihre vertraulichen Informationen zugreifen

user3030895
quelle
Standardmäßig sind Inhaltsanbieter nicht verfügbar, und die Verwaltung von Zugriffsbeschränkungen für sie ist einfach. Downvote für die Verbreitung von Fehlinformationen.
TBridges42
2
@ TBridges42 Du liegst (waren) falsch. In der Tat, bis API Level 17 Content Provider ausgesetzt wurden . Zum Zeitpunkt der Antwort waren 25% der Android-Geräte von diesem Verhalten betroffen und zum Zeitpunkt Ihres Kommentars immer noch 10% . Es ist also eher umgekehrt: Ihr Kommentar ist gefährlich, da Sie etwas als sicher bezeichnen, was nicht der Fall ist / war.
Murmel
0

Die Verwendung eines Inhaltsanbieters kann zu einer zusätzlichen Abstraktionsebene beitragen. Wenn Sie ihn in Ihre eigene Anwendung integrieren, verlängert sich die Entwicklungszeit Ihres Projekts erheblich. Wenn Sie es jedoch verwenden, um Daten, Anwendungseinstellungen oder Konfigurationen für mehrere Anwendungen freizugeben, ist der Inhaltsanbieter Ihre Wahl.

Achten Sie auf Ihre Sicherheitsstufen, und ich würde empfehlen, SQLcipher zum Verschlüsseln von Daten beim Zurücksetzen (DAR) zu verwenden, wenn Ihr Inhaltsanbieter in SQLite schreibt. (Ich habe in einigen Lösungen einen Inhaltsanbieter verwendet und die Möglichkeit bereitgestellt, einen Live-Schnappschuss der Betriebswerte für das Debuggen und Testen zu erstellen.)

Jim Row
quelle