it-swarm.com.de

SQLite-Datenbank zwischen 2 Android Apps?

Ich muss eine einzelne Datenbank für zwei Apps freigeben. Ich weiß, dass die Datenbank unter/data/data/MY_PACKAGE/databases/erstellt wird. Ist es möglich, den Pfad zu einem Paketnamen zu definieren, wenn ich die Datenbank in einer der beiden Anwendungen erstelle, da die Paketnamen unterschiedlich sind? Vielen Dank.

53
bond

Sie können mit Sicherheit eine einzelne Datenbank für zwei Apps freigeben.

Um Daten zwischen Apps auszutauschen (vorausgesetzt, sie werden vom selben Herausgeber ausgegeben), müssen Sie in der AndroidManifest.xml beider Apps eine freigegebene Benutzer-ID angeben.

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

(Es ist nicht dokumentiert, aber die freigegebene Benutzer-ID muss eine Zeichenfolge mit mindestens einem Punkttrennzeichen sein.)

Der Rest ist einfach und Sie müssen nicht mit dem Datenbankpfad herumspielen. Verwenden Sie in beiden Apps einfach den gleichen DBAdapter. 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 auf die Datenbank mit dem Kontext der Datenbank-Hosting-App 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();

Wenn Ihre Datenbank bereits vorhanden ist, bevor Sie die freigegebene Benutzer-ID im Manifest festgelegt haben, müssen Sie die Apps auf einem physischen Gerät deinstallieren/erneut installieren, damit Sie Ihre Datenbank nicht sperren (SQLite-Fehler 14). Der Emulator hingegen könnte sich als verzeihender erweisen. Unterm Strich funktioniert es nicht, wenn Ihre Apps auf dem Markt für Android=) veröffentlicht werden, wenn Sie im Nachhinein eine gemeinsame Benutzer-ID festlegen.

Hoffe das hilft.

82

Der Datenbankpfad ist für jede Anwendung privat und meines Wissens ist es nicht möglich, direkt über Anwendungen darauf zuzugreifen.

Ein Ansatz ist jedoch, dass eine Anwendung ihre Datenbank mit einem ContentProvider für die andere zugänglich macht. Überprü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 über Anwendungen hinweg gemeinsam zu nutzen. Es gibt keinen gemeinsamen Speicherbereich, auf den alle Android Pakete zugreifen können.

5
mibollma

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

1
Charleston