¿Compartir la base de datos SQLite entre 2 aplicaciones de Android?
Necesito compartir una única base de datos entre 2 aplicaciones. Sé que la base de datos se creará en /data/data/MY_PACKAGE/databases/. Dado que los nombres de los paquetes son diferentes, ¿es posible definir la ruta a un nombre de paquete cuando creo la base de datos en cualquiera de las aplicaciones? Gracias.
ACTUALIZACIÓN: El método que se describe a continuación se basa en android:sharedUserId
, obsoleto a partir del nivel de API 29 (Android 10).
Ciertamente puedes compartir una única base de datos entre 2 aplicaciones.
Para compartir datos entre aplicaciones (siempre que sean emitidas por el mismo editor), deberá especificar una identificación de usuario compartida en AndroidManifest.xml de ambas aplicaciones.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:sharedUserId="my.app" ... >
(No está documentado, pero la identificación de usuario compartida debe ser una cadena con al menos un separador de puntos)
El resto es fácil y no es necesario perder el tiempo con la ruta de la base de datos. Simplemente use el mismo DBAdapter en ambas aplicaciones. En la aplicación que aloja la base de datos, llame a DBAdapter con el contexto nativo.
DBadapter hostDBAdapter = new DbAdapter(getApplicationContext());
performerDBadapter.open();
En la segunda aplicación, acceda a la base de datos con el contexto de la aplicación de alojamiento de la base de datos.
Primero, defina el contexto compartido:
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;
}
Luego abra el DBAdapter con el contexto compartido:
DbAdapter sharedDBadapter = new PerformerDbAdapter(sharedContext);
sharedDBadapter.open();
Como nota final, si su base de datos existe antes de configurar la identificación de usuario compartida en el manifiesto, deberá desinstalar/reinstalar las aplicaciones en un dispositivo físico, para no bloquear su acceso a su base de datos (error 14 de SQLite). El emulador, por otro lado, podría resultar más indulgente. En pocas palabras, si sus aplicaciones se publican en el mercado de Android, configurar una identificación de usuario compartida en el último momento no funcionará.
Espero que esto ayude.
La ruta de la base de datos es privada para cada aplicación y, hasta donde yo sé, no es posible acceder a ella directamente entre aplicaciones.
Sin embargo, un enfoque es que una aplicación haga que su base de datos sea accesible para la otra mediante un ContentProvider . Comprueba si eso funciona para ti.
Los proveedores de contenido almacenan y recuperan datos y los hacen accesibles a todas las aplicaciones. Son la única forma de compartir datos entre aplicaciones; No existe un área de almacenamiento común a la que puedan acceder todos los paquetes de Android.
Siempre que utilice el mismo certificado en ambas aplicaciones, sus aplicaciones se ejecutarán en el mismo proceso y se comportarán como si fueran la misma aplicación. Consulte esta sección de la documentación de Android http://developer.android.com/tools/publishing/app-signing.html #estrategias