Ich bin ein Neuling auf Android und arbeite an einer einfachen Anwendung, um grundlegende Erfahrungen zu sammeln. Meine App ist ziemlich einfach und besteht unter anderem aus einem Rundfunkempfänger und einigen Aktivitäten. Beide Komponenten verwenden eine einzige Datenbank. Theoretisch kann es also vorkommen, dass beide versuchen, gleichzeitig auf die Datenbank zuzugreifen.
Derzeit instanziiere ich einfach jedes Mal das DB-Objekt (eine SQLite-DB-Hilfsklasse), wenn ich es benötige, und führe die erforderlichen Operationen aus: Abfragen, Einfügen usw.
Nach dem, was ich hier und in einigen anderen Dokumenten gelesen habe, besteht das Problem, dass bei gleichzeitigem Zugriff auf die Datenbank eine Ausnahme "Datenbank gesperrt" angezeigt wird. Ein besserer Ansatz wäre also, eine einzige Instanz dieses Datenbankobjekts zu haben Komponenten verwenden immer dieselbe Datenbankverbindung.
Ist die obige Argumentation richtig? Wäre ein Singleton dann eine ausreichend gute Lösung dafür? Ich weiß, dass einige Puristen vielleicht dagegen argumentieren, aber bitte beachten Sie, dass dies eine ziemlich einfache Anwendung ist, damit ich es mir leisten kann, Dinge zu tun, die ich in anderen Fällen nicht tun würde.
Was wäre sonst eine bessere Option? Ich habe über die Verwendung von Inhaltsanbietern gelesen, aber es wäre zu viel dafür, außerdem bin ich nicht daran interessiert, die Daten mit anderen Aktivitäten zu teilen. Ich habe diesen Beitrag tatsächlich gelesen und fand ihn ziemlich hilfreich.
ContentProvider
wenn der Datenbankzugriff mit einer anderen Anwendung geteilt wird.getInstance
synchron zu machen ?Ich habe nie darüber gelesen, wie man mit einem Singleton auf eine Datenbank auf Android zugreift. Würde es Ihnen etwas ausmachen, einen Link dazu bereitzustellen?
In meinen Apps verwende ich einfache dbhelper-Objekte, keine Singletons. Ich dachte, dies ist eher die Aufgabe der SQL-Engine, um sicherzustellen, dass db nicht gesperrt ist, nicht die Aufgabe Ihrer Android-Klassen, und es funktioniert ziemlich gut für meine größte App, die ist mittelgroß.
Update Nr. 1: Wenn Sie sich die von Ihnen angegebene Referenz ansehen, sieht es so aus, als ob das Problem überhaupt nicht darin besteht, verschiedene Instanzen von a zu verwenden
dbhelper
. Selbst eine einzelne Instanz kann auf Probleme beim Zugriff auf die Datenbanken stoßen: Das Problem beruht auf gleichzeitigen Zugriffen. Die einzige Möglichkeit, einen ordnungsgemäßen Zugriff verschiedener Threads auf die Datenbank sicherzustellen, besteht in der Verwendung einfacher Thread-Synchronisationsmechanismen (synchronized
Methoden oder Blöcke), die fast nichts mit der Verwendung eines Singletons zu tun haben.Update Nr. 2: Der zweite Link, den Sie bereitstellen, zeigt deutlich, dass Singleton-DBhelper-Objekte erforderlich sind, wenn mehrere Threads gleichzeitig in eine Datenbank schreiben. Dies kann beispielsweise passieren, wenn Sie SQL-Vorgänge (Einfügen / Aktualisieren / Löschen) in AsyncTasks ausführen. In diesem Fall würde ein Singleton-Objekt dbhelper einfach alle SQL-Operationen in eine Art Pipeline einfügen und sie der Reihe nach ausführen.
Diese Lösung ist möglicherweise einfacher zu implementieren als die ordnungsgemäße Thread-Synchronisierung mit synchronisierten Methoden in Java. Eigentlich denke ich, dass es irgendwo in Android-Dokumenten mehr Nachdruck auf dieses Problem geben sollte und die Verwendung eines Singleton-DB-Helfers gefördert werden könnte.
Vielen Dank für diese nette Frage und die Folgemaßnahmen.
quelle