57 votes

Partager une base de données SQLite entre 2 applications Android ?

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

1 votes

groups.google.com/group/Android-developers/browse_thread/thread/ Ce fil de discussion traite d'un sujet similaire ; voyez si cela peut vous aider.

87voto

Daniel Szmulewicz Points 1893

MISE À JOUR : La méthode décrite ci-dessous repose sur les éléments suivants android:sharedUserId , déprécié à partir du niveau 29 de l'API (Android 10).

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

Pour partager des données entre applications (à condition qu'elles soient émises par le même éditeur), vous devez spécifier un identifiant d'utilisateur partagé dans le fichier AndroidManifest.xml des deux applications.

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

(C'est non documenté, mais l'identifiant de l'utilisateur partagé doit être une chaîne de caractères avec au moins un séparateur de points).

Le reste est facile, et vous n'avez pas besoin de vous embêter avec le chemin de la base de données. Il suffit d'utiliser le même adaptateur de base de données 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 seconde application, accédez à la base de données avec le contexte de l'application d'hébergement de la base de données.
Tout d'abord, définissez 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;
        }   

Ensuite, ouvrez le DBAdapter avec le contexte partagé :

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

Enfin, si votre base de données existe avant la définition de l'identifiant d'utilisateur partagé dans le manifeste, vous devrez désinstaller/réinstaller les applications sur un appareil physique pour ne pas vous bloquer dans votre base de données (erreur sqlite 14). L'émulateur, en revanche, pourrait s'avérer plus indulgent. En conclusion, si vos applications sont publiées sur le marché Android, la définition d'un identifiant d'utilisateur partagé après coup ne fonctionnera pas.

J'espère que cela vous aidera.

5 votes

Cela m'a beaucoup aidé, mais il me reste encore un problème à résoudre, à savoir comment éviter de perdre la base de données lorsque la "première" application est désinstallée. Veuillez consulter lien .

3 votes

C'est vrai, mais ce n'est pas la méthode "officielle". La documentation Android recommande les fournisseurs de contenu pour partager les données entre les applications, je crois. Il s'agit plutôt d'un hack (très pratique).

0 votes

Je suis d'accord avec Daniel, la voie officielle est celle des fournisseurs de contenu. J'encourage tout le monde à ne pas recourir à ce genre d'astuces. Les fournisseurs de contenu sont bien documentés et compris, et il existe de nombreux exemples, etc.

6voto

mibollma Points 5389

Le chemin de 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 applications.

Cependant, une approche consiste à ce qu'une application rende sa base de données accessible à l'autre à l'aide d'une ContentProvider . Vérifiez si cela fonctionne pour vous.

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

1voto

Charleston Points 31

Tant que vous utilisez le même certificat sur les deux applications, vos applications fonctionneront sur le même processus et se comporteront comme étant la même application. Consultez cette section de la documentation Android http://developer.Android.com/tools/publishing/app-signing.html#strategies

0 votes

Le partage d'une base de données est très bien jusqu'à ce que vous rencontriez des conflits. J'ai finalement dû abandonner cette idée et opter pour la meilleure conception des fournisseurs de bases de données. Il faut qu'une application crée le fournisseur et que les deux applications puissent envoyer des requêtes au même fournisseur. Maintenant, vous avez une classe dirigeante qui peut dicter quand la base de données est verrouillée ou non.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X