Genauer Unterschied zwischen "Content-Provider" und "SQLite-Datenbank"

87

Ich habe SQLite-Datenbankprogrammierung für Android durchgeführt, aber ich weiß nichts über Content-Provider außer diesem: "Da ich auf die Android Developer-Seite verwiesen habe , erklärte Android SDK über" Content-Provider ", wie es zum Speichern und Abrufen von Daten verwendet wird."

Aber dann,

  1. Was ist der genaue Unterschied zwischen "Content-Provider" und "SQLite-Datenbank"?
  2. Welches ist am besten geeignet, um Daten wann zu speichern?

Irgendein Beispiel oder hilft !!

Paresh Mayani
quelle

Antworten:

134

Ich fand einen großen Unterschied wie folgt:

Das Speichern Ihrer Daten in einer Datenbank ist ein guter Weg, um Ihre Daten zu speichern , aber es gibt eine Einschränkung bei Android-Datenbanken, die in Android erstellt wurden, visiblenur für die Anwendung, die sie erstellt hat. Das heißt, eine von einer Anwendung auf Android erstellte SQLite-Datenbank kann nur von dieser Anwendung verwendet werden, nicht von anderen Anwendungen.

Also, wenn Sie need to share data between applications, you need to use the content provider model as recommended in Android.Dieser Artikel beschreibt die Grundlagen von Inhaltsanbietern und wie Sie einen implementieren können.

Ich habe diesen Artikel unter diesem Link gefunden

Wirklich nette Informationen zur Verfügung gestellt.

Paresh Mayani
quelle
2
Scheint, als wäre der Link jetzt tot ... sehe den Artikel nicht mehr. Ich möchte den Artikel sehen, auf den Sie verweisen, wenn Sie ihn wiederfinden.
Prolink007
am 11. Februar 2012 funktioniert der Link http://www.devx.com/wireless/Article/41133 ,
k3b
Was ist, wenn wir dabei Mechanismen bereitstellen, um die Daten über mehrere Anwendungen hinweg threadsicher zu teilen?
Manohar
2
Ein weiterer zusätzlicher Vorteil besteht darin, dass Inhaltsanbieter für jeden Vorgang einen einzelnen Thread verwenden, sodass mehrere Threads die Datenbank nicht wie in einem SQLite-Fall ändern können
Rat-a-tat-a-tat Ratatouille
54

Was ist der genaue Unterschied zwischen "Content-Provider" und "SQLite-Datenbank"?

ContentProviderist eine Fassade - eine API, die Sie implementieren können, um Datenbanken anderen Prozessen auszusetzen. Es kann so implementiert werden, dass die Daten in einer SQLite-Datenbank gespeichert sind, muss es aber nicht sein.

Welches ist am besten geeignet, um Daten wann zu speichern?

Das ist nicht abstrakt zu beantworten. Verwenden Sie im Allgemeinen ContentProvidernur eine Datenbank , es sei denn, Sie müssen eine verwenden.

CommonsWare
quelle
26
Ich bevorzuge die Verwendung eines ContentProviders, da dies eine sehr schöne Abstraktion gegenüber SQL ist. Sie können auch gut mit CursorAdapter und automatischen Abfragen spielen.
Alexanderblom
26

Ich habe viele gute Apps mit Tausenden von Benutzern erstellt, die einfach SQLite-Methoden verwendeten. Aber das war vor einer Weile und ich musste manuell viel Code schreiben, der jetzt von ContentProvider problemlos erledigt werden kann. Damals war ich nicht für die Verwendung von Inhaltsanbietern, da dies den Code nur noch komplexer zu machen schien.

In den letzten Jahren, als sich Android weiterentwickelt hat, bin ich zu ContentProvider gewechselt, da dies Zeit spart und es Ihnen ermöglicht, mehr zu tun. Ich benutze es jetzt ausgiebig. Sobald Sie eine Content Provider-Klasse geschrieben haben, wird Ihr Leben viel einfacher. Mit ContentProvider kann ich sehr einfach mit Cursor Loadern, Loader Callbacks und Bulk Inserts umgehen, für die ich in der Vergangenheit alles manuell schreiben musste und die trotzdem nicht so effizient funktionierten. Insbesondere beim Aktualisieren der Listenansicht, die jetzt dank nur einer notifychange () -Methode automatisch aktualisiert wird. Dies bedeutet, dass ich jetzt keine eigenen Listener eingeben und den Inhalt in Listenansichten und Adaptern manuell aktualisieren muss. Außerdem muss ich mir keine Gedanken über das Öffnen und Schließen von Datenbanken oder über Speicherlecks machen. Das alles erledigt der Inhaltsanbieter. Das einzige Problem, mit dem ich gelegentlich konfrontiert bin, ist, dass Sie in ContentProviders keine komplexen Abfragen durchführen können. In diesem Fall können Sie weiterhin Rohabfragen verwenden und die altmodische manuelle Interaktion mit SQLite verwenden.

Wenn Sie zuvor Ihren eigenen DbAdapter, Helper und Observer geschrieben haben, können Sie diese sicher auf Ihre neuen Apps übertragen, ohne Zeit für die Konvertierung aller Inhalte in ContentProvider aufzuwenden. Aufgrund meiner Erfahrung würde ich jedoch wärmstens empfehlen, zu ContentProvider zu wechseln. Es wird einige Zeit dauern, bis Sie sich daran gewöhnt haben, aber sobald Sie Erfahrung damit haben, werden Sie dabei bleiben.

UPDATE 2017 Ich bin jetzt zu Realm gewechselt , einer viel besseren Möglichkeit, Datenbanken auf jeder Plattform zu verwenden. Verbringen Sie ein paar Stunden damit, es zu lernen, und sparen Sie unzählige Stunden in Ihrer Karriere als App-Entwickler.

Zeeshan
quelle
Ich dachte daran, meinen Code in einen Inhaltsanbieter umzuwandeln, aber jetzt denke ich daran, ihn beizubehalten.
Mohammed Subhi Sheikh Quroush
Jetzt können Sie auch die 'Room'-Bibliothek von Android
Ravindra Kushwaha
8

1. Inhaltsanbieter sind nicht threadsicher

Standardmäßig sind Inhaltsanbieter nicht threadsicher. Wenn Sie mehrere Threads verwenden, die einen Inhaltsanbieter verwenden, werden möglicherweise viele verschiedene Ausnahmen und andere Dateninkonsistenzen ausgelöst. Der einfachste Weg, dies zu beheben, besteht darin, das synchronisierte Schlüsselwort für jede der vom Inhaltsanbieter bereitgestellten öffentlichen Methoden zu verwenden.

Auf diese Weise kann jeweils nur ein Thread auf diese Methoden zugreifen.

2. Spielen Sie gut, wenn Sie viele Schreibvorgänge ausführen

In der neuen Serval Maps-Anwendung müssen Daten aus Binärdateien in die von der Anwendung intern verwendete Datenbank importiert werden. Um dies zu tun und mit dem Rest der Anwendung gut zu spielen, ist es am besten:

Erstellen Sie einen neuen Thread, um den Import durchzuführen, damit andere Threads nicht beeinträchtigt werden, insbesondere der Thread, der für die Aktualisierung der Benutzeroberfläche zuständig ist. und Pause am Ende jedes Imports, um anderen Threads, die die synchronisierten Methoden verwenden müssen, eine größere Chance zu geben.

3. Inhaltsanbieter zwingen Sie manchmal dazu, seitlich zu denken

Die Art und Weise, wie Inhaltsanbieter in Android arbeiten, besteht darin, eine Abstraktionsebene zwischen dem Rest Ihres Codes und der zugrunde liegenden Datenbank bereitzustellen. Dies liegt hauptsächlich daran, dass Inhaltsanbieter, soweit ich das beurteilen kann, von anderen Orten als von Datenbanken aus auf Daten zugreifen können.

Dies bedeutet, dass Sie keine SQL-Rohabfragen in der zugrunde liegenden Datenbank ausführen können und die verschiedenen Komponenten einer SQL-Abfrage mithilfe von Variablen angeben müssen, die an die verschiedenen Methoden übergeben werden, z. B. die Abfragemethode. Wenn Sie eine Aufgabe haben, die nicht in die Art und Weise passt, wie SQL von einem Inhaltsanbieter behandelt wird, haben Sie zwei Möglichkeiten:

Denken Sie seitlich über die Abfrage nach. Vielleicht können Sie die Daten, die Sie benötigen, durch alternative Abfragen und den Zugriff auf die Ergebnisse über den Cursor erhalten. und Verwenden Sie einen URI für den normalen Zugriff auf die Daten und einen speziellen URI, der einer bestimmten Abfrage für Aufgaben zugeordnet ist, für die es keine Alternativen gibt.

Chanu
quelle
wie pro Contentprovider sechs abstrakte Methoden der Contentprovider, die umgesetzt werden müssen , kann von mehreren Threads gleichzeitig aufgerufen werden, so müssen sie als Thread-sicher umgesetzt werden. Die abstrakte Klasse ContentProvider ist nicht der Grund für Ausnahmen eines bestimmten Codes, sondern die Implementierung. Befolgen Sie Prozesse und Threads , um threadsichere Methoden von ContentProvider zu implementieren.
StahlRat vor
5

Inhaltsanbieter werden verwendet, wenn Sie Ihre Daten für mehrere Anwendungen freigeben möchten.

Wenn Sie eine Datenbank an eine Anwendung angehängt haben und möchten, dass eine andere Anwendung einige Daten verwendet, können Sie einen Inhaltsanbieter implementieren, der die Daten verfügbar macht

Mina Samy
quelle
3

Der Hauptunterschied besteht darin, dass Ihre App Content-Provider verwenden muss, wenn Ihre Informationen an andere Apps weitergegeben werden müssen. SQLite speichert nur Daten für die App, die sie erstellt

Daniel Uribe Ayvar
quelle
3

Ich habe diese Antwort gelesen , während ich nach dem gleichen Zweifel gesucht habe, also habe ich darüber nachgedacht, sie zu teilen. Es sagt aus -

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 einen ContentProvider verwenden, können Sie alle strukturellen Änderungen darin enthalten. Wenn Sie keinen 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.

Die Verwendung eines Inhaltsanbieters wäre daher eine gute Idee.

Darpan
quelle
3

Denken Sie an fortschrittliche Content Management Systeme. Jedes Objekt (Seite, Bild, Nachrichtenartikel, Ereigniselement usw.) verfügt über einen Inhalt, eine Adresse, Benutzerberechtigungen und Möglichkeiten zur Interaktion mit ihm aus verschiedenen Teilen des Systems. Inhaltsanbieter tun dies für Android. Sie können jetzt Dateien oder Bilder freigeben, die Sie möglicherweise in Ihrer Anwendung gespeichert haben. Sie können auch benutzerdefinierte gemeinsam nutzbare Objekte erstellen, z. B. Geschäftskontakte, bearbeitbare Notizen usw., und die Sicherheit und die Standardanwendung für den Umgang mit solchen Objekten angeben, wenn Sie sie in einer anderen Anwendung öffnen.

Roberto
quelle