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?
android
android-contentprovider
Pzanno
quelle
quelle
Antworten:
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.
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.
quelle
CursorLoader
, um asynchrone Abfragen auszuführen ... Sie haben Zugriff auf eine Singleton-Instanz (dieContentResolver
), 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 freigebenContentProvider
. Tatsächlich wurde die letzte App, an der wir gearbeitet haben, ursprünglich mit a erstelltContentProvider
und 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 grundlegenderContentProvider
s zu vereinfachen : github.com/casidiablo/persistence hatte es aber nie selbst benutzt XD).ContentProvider
wenn 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.Ich würde behaupten, es ist definitiv eine gute Idee, ein zu verwenden,
ContentProvider
auch 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 verwenden
ContentProvider
, 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
ContentProvider
Front-Up verwenden, ist es viel schwieriger, es zu einem späteren Zeitpunkt nachzurüsten.Dann gibt es die anderen Teile von Android, in denen
ContentProvider
s erforderlich / empfohlen sind, z. B. bei Verwendung vonSyncAdapter
s 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
ContentProvider
erfordert (sobald Sie die API kennengelernt haben, was ohnehin eine gute Idee ist). Daher ist dies auch für private Daten sinnvoll.quelle
android:exported="false"
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.
quelle
Kurz gesagt,
Content Providers
hilft bei der effektiven Verwaltung Ihrer Daten . Ich würde vorschlagen, sie aus den folgenden Gründen zu verwenden.SyncAdapter
. Beispielsweise können Sie eine Liste automatisch aktualisieren, wenn sich ein Wert in einer Datenbank mithilfe von ContentProvidern zusammen mit ändertCursorLoader
. Ohne ContentProvider müssen Sie viele dieser Funktionen selbst implementieren.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.
quelle
ContentProviders
und drei verschiedene Gründe, warum wir sie verwenden sollten. Manchmal sind die einfachen Erklärungen die besten. +1Ich 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.
quelle
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
quelle
Wie in der Dokumentation beschrieben: Erstellen eines Inhaltsanbieters
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.
quelle
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
quelle
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.)
quelle