Teilen Sie die SQLite-Datenbank zwischen 2 Android-Apps?

Lesezeit: 3 Minuten

Ich muss eine einzelne Datenbank zwischen 2 Apps teilen. Ich weiß, dass die Datenbank auf /data/data/MY_PACKAGE/databases/ erstellt wird. Da die Paketnamen unterschiedlich sind, ist es möglich, den Pfad zu einem Paketnamen zu definieren, wenn ich die Datenbank in einer der beiden Apps erstelle? Danke.

Teilen Sie die SQLite Datenbank zwischen 2 Android Apps
Daniel Szmulewicz

UPDATE: Die unten beschriebene Methode stützt sich auf android:sharedUserIdveraltet ab API-Level 29 (Android 10).

Sie können sicherlich eine einzelne Datenbank zwischen 2 Apps teilen.

Um Daten zwischen Apps zu teilen (vorausgesetzt, sie werden von demselben Herausgeber herausgegeben), müssen Sie eine gemeinsame Benutzer-ID in der AndroidManifest.xml beider Apps angeben.

<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:sharedUserId="my.app" ... >

(Es ist nicht dokumentiert, aber die gemeinsame Benutzer-ID muss eine Zeichenfolge mit mindestens einem Punkt als Trennzeichen sein.)

Der Rest ist einfach, und Sie müssen nicht mit dem Datenbankpfad herumspielen. Verwenden Sie einfach den gleichen DBAdapter in beiden Apps. Rufen Sie in der App, die die Datenbank hostet, den DBAdapter mit dem nativen Kontext auf.

DBadapter hostDBAdapter = new DbAdapter(getApplicationContext());
performerDBadapter.open();

Greifen Sie in der zweiten App mit dem Kontext der Datenbank-Hosting-App auf die Datenbank zu.
Definieren Sie zunächst den gemeinsamen Kontext:

Context sharedContext = null;
    try {
        sharedContext = this.createPackageContext("replace.with.host.package.name", Context.CONTEXT_INCLUDE_CODE);
        if (sharedContext == null) {
            return;
        }
    } catch (Exception e) {
        String error = e.getMessage(); 
        return;
        }   

Öffnen Sie dann den DBAdapter mit dem freigegebenen Kontext:

DbAdapter sharedDBadapter = new PerformerDbAdapter(sharedContext);
sharedDBadapter.open();

Als letzte Anmerkung: Wenn Ihre Datenbank vor dem Festlegen der gemeinsam genutzten Benutzer-ID im Manifest vorhanden ist, müssen Sie die Apps auf einem physischen Gerät deinstallieren/neu installieren, damit Sie sich nicht aus Ihrer Datenbank aussperren (sqlite-Fehler 14). Der Emulator hingegen könnte sich als nachsichtiger erweisen. Fazit: Wenn Ihre Apps auf dem Android Market veröffentlicht werden, funktioniert das nachträgliche Festlegen einer gemeinsamen Benutzer-ID nicht.

Hoffe das hilft.

  • Das war eine großartige Hilfe, aber ich habe immer noch ein Problem – nämlich, wie verhindert werden kann, dass die Datenbank verloren geht, wenn die “erste” App deinstalliert wird. Siehe Link.

    – Peri Hartmann

    27. Dezember 2012 um 3:54 Uhr

  • Richtig, nicht der “offizielle” Weg. Die Android-Dokumentation empfiehlt Inhaltsanbietern, Daten zwischen Apps auszutauschen, denke ich. Dies ist eher ein Hack (ein praktischer).

    – Daniel Szmulewicz

    20. Juni 2013 um 15:50 Uhr

  • Ich stimme Daniel zu, der offizielle Weg ist Content Provider. Ich möchte jeden ermutigen, nicht auf solche Hacks zurückzugreifen. Inhaltsanbieter sind inzwischen gut dokumentiert und verstanden, und es gibt viele Beispiele usw.

    – Michael Kariv

    10. Februar 2014 um 8:38 Uhr

  • Ich versuche, dasselbe mit 2 Android-Apps zu tun, die in Eclipse erstellt werden. Müssen Sie auch Ihre Quelldatei für “DBadapter” in beide App-Projekte einbinden?

    – giannileuani

    24. Februar 2014 um 3:28 Uhr

  • Ich verstehe nicht, was DbAdapter oder PerformerDbAdapter ist, ich sehe solche Klassen nicht in der Android-API. Bitte klären Sie

    – ultraon

    14. Juli 2015 um 14:50 Uhr

Der Datenbankpfad ist für jede Anwendung privat und soweit ich weiß, ist es nicht möglich, direkt über Anwendungen darauf zuzugreifen.

Ein Ansatz besteht jedoch darin, dass eine Anwendung ihre Datenbank der anderen mithilfe von a zugänglich macht Inhalt Anbieter. Prüfen Sie, ob das für Sie funktioniert.

Inhaltsanbieter speichern und rufen Daten ab und machen sie für alle Anwendungen zugänglich. Sie sind die einzige Möglichkeit, Daten anwendungsübergreifend zu teilen; Es gibt keinen gemeinsamen Speicherbereich, auf den alle Android-Pakete zugreifen können.

Solange Sie dasselbe Zertifikat für beide Anwendungen verwenden, werden Ihre Anwendungen auf demselben Prozess ausgeführt und verhalten sich wie dieselbe Anwendung. Lesen Sie diesen Abschnitt der Android-Dokumentation
http://developer.android.com/tools/publishing/app-signing.html#strategies

  • Das Teilen einer DB ist alles gut, bis Sie auf Konflikte stoßen, schließlich musste ich dies verwerfen und mich für das bessere Design von Datenbankanbietern entscheiden. Lassen Sie eine App den Anbieter erstellen, und dann können beide Apps Anfragen an denselben Anbieter senden. Jetzt haben Sie eine leitende Klasse, die bestimmen kann, wann die Datenbank gesperrt ist oder nicht.

    – JPM

    2. Juni 2014 um 14:37 Uhr

923650cookie-checkTeilen Sie die SQLite-Datenbank zwischen 2 Android-Apps?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy