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,
- Was ist der genaue Unterschied zwischen "Content-Provider" und "SQLite-Datenbank"?
- Welches ist am besten geeignet, um Daten wann zu speichern?
Irgendein Beispiel oder hilft !!
quelle
ContentProvider
ist 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.Das ist nicht abstrakt zu beantworten. Verwenden Sie im Allgemeinen
ContentProvider
nur eine Datenbank , es sei denn, Sie müssen eine verwenden.quelle
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.
quelle
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.
quelle
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
quelle
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
quelle
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 -
Die Verwendung eines Inhaltsanbieters wäre daher eine gute Idee.
quelle
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.
quelle
Ein Unterschied besteht darin, dass Inhaltsanbieter Plattformunterstützung für Inhaltsbeobachter bieten. Sie müssen Ihr eigenes Observable-Muster für eine SQLite-Datenbank implementieren.
Automatische Abfrage mit LoaderManager
ContentObserver für SQLite?
quelle