2016-07-13 15 views
0

Ich habe einen Intentservice, der von Alarmmanager etwa jede Stunde ausgelöst wird, wenn er Daten von einem Server herunterlädt und Einfügungen in eine meiner SQLite-Datenbanktabellen vornimmt.Verwendung von SQLiteOpenHelper aus separaten Prozessen

Ich habe einen anderen lang laufenden Hintergrund-Service, der SCREEN_ON-Aktionen abfängt und auch Einfügungen und Lesungen für dieselbe Datenbanktabelle durchführt. Der Hintergrunddienst wird in einem eigenen Prozess ausgeführt. Dies ist, wie ich es in dem Manifest erklären:

<service 
    android:name=".MyBackgroundService" 
    android:enabled="true" 
    android:exported="false" 
    android:process=":background"/> 

Meine Frage ist, was passiert, wenn durch Zufall zwei Dienste exakt gleiche Zeit tun Datenbank Einfügungen/Messwerte auf, wird es keine Probleme verursachen, wie meine Anwendung abstürzt? Wenn ja. Wie kann ich das beheben?

Antwort

2

Ja, schreiben die gleichzeitig auf die gleiche Datenbank mehrere Prozesse hat, wird Probleme verursachen, die in Ihrer Anwendung wahrscheinlich dazu führen wird abstürzt (denken Sie daran eine Datenbank tatsächlich eine Datei im internen Speicher ist).

A ContentProvider ist ein hohes Maß Komponente, die Sie in Ihrem Manifest registrieren, die mehrere Prozesse Daten (oder andere Anwendungen, wenn Sie verwenden android:exported="true") ermöglicht das Lesen und Schreiben und verwendet einen Cursor-basierte API, die natürlich mit einer SQL-basierte Datenbank passt. Die Creating a Content Provider training führt die Schritte durch, die zum Erstellen eines Inhaltsanbieters erforderlich sind, einschließlich des Erstellens eines Uri - Schemas (eine Möglichkeit zur eindeutigen Bestimmung, über welche Tabelle/Zeile Sie sprechen) - im Allgemeinen können Sie Ihre direkten Zugriffe auf Ihre ersetzen Datenbank mit den Entsprechungen zu ContentResolver.

+0

Wird diese Garantie meine SQLite-Transaktionen in die Warteschlange gestellt und beendet, wenn Kollisionen auftreten? – hal0360

+0

Ja, Sie hätten nur einen 'SQLiteOpenHelper', mit dem alles über Ihre gesamte App läuft. – ianhanniballake

+0

„mit mehreren Prozessen schreiben auf die gleiche Datenbank zur gleichen Zeit wird Probleme verursachen, die in Ihrer Anwendung abstürzt wahrscheinlich dazu führen wird“ - SQLite Griffe diese auf anderen Plattformen. Ich stimme zu, dass ein "ContentProvider" hier die richtige Antwort ist, aber ich bin neugierig, wenn Sie etwas über SQLite auf Android wissen, das den Zugriff auf mehrere Prozesse verbietet. – CommonsWare