web-dev-qa-db-fra.com

Partager la base de données SQLite entre 2 Android?

Je dois partager une seule base de données entre 2 applications. Je sais que la base de données sera créée sur/data/data/MY_PACKAGE/databases /. Étant donné que les noms de packages sont différents, est-il possible de définir le chemin d'accès à un nom de package lorsque je crée la base de données sur l'une ou l'autre des applications? Merci.

53
bond

Vous pouvez certainement partager une seule base de données entre 2 applications.

Afin de partager des données entre les applications (à condition qu'elles soient émises par le même éditeur), vous devrez spécifier un ID utilisateur partagé dans le AndroidManifest.xml des deux applications.

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

(Ce n'est pas documenté, mais l'ID utilisateur partagé doit être une chaîne avec au moins un séparateur de points)

Le reste est facile, et vous n'avez pas besoin de jouer avec le chemin de la base de données. Utilisez simplement le même DBAdapter dans les deux applications. Dans l'application qui héberge la base de données, appelez le DBAdapter avec le contexte natif.

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

Dans la deuxième application, accédez à la base de données avec le contexte de l'application d'hébergement de base de données.
Définissez d'abord le contexte partagé:

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;
        }   

Ouvrez ensuite le DBAdapter avec le contexte partagé:

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

Enfin, si votre base de données existe avant de définir l'ID utilisateur partagé dans le manifeste, vous devrez désinstaller/réinstaller les applications sur un appareil physique, de peur de vous verrouiller hors de votre base de données (erreur sqlite 14). L'émulateur, d'autre part, pourrait s'avérer plus indulgent. En fin de compte, si vos applications sont publiées sur le marché Android, la définition d'un ID utilisateur partagé après coup ne fonctionnera pas.

J'espère que cela t'aides.

82
Daniel Szmulewicz

Le chemin d'accès à la base de données est privé pour chaque application et, pour autant que je sache, il n'est pas possible d'y accéder directement entre les applications.

Cependant, une approche est qu'une application rend sa base de données accessible à l'autre en utilisant un ContentProvider . Vérifiez si cela fonctionne pour vous.

Les fournisseurs de contenu stockent et récupèrent les données et les rendent accessibles à toutes les applications. Ils sont le seul moyen de partager des données entre les applications; il n'y a pas de zone de stockage commune à laquelle tous les packages Android Android peuvent accéder.

5
mibollma

Tant que vous utilisez le même certificat sur les deux applications, vos applications s'exécuteront sur le même processus et se comporteront comme étant la même application, vérifiez cette section de la documentation Android documentation http: // développeur. Android.com/tools/publishing/app-signing.html#strategies

1
Charleston