我需要在2个应用之间共享一个数据库。我知道数据库将在/ data / data / MY_PACKAGE / databases /上创建。由于包名称不同,我可以在任一应用程序上创建数据库时定义一个包名的路径吗? 谢谢。
答案 0 :(得分:81)
您当然可以在2个应用之间共享一个数据库。
为了在应用之间共享数据(前提是它们由同一发布者发布),您需要在两个应用的AndroidManifest.xml中指定共享用户ID。
<manifest xmlns:android="http://schemas.android.com/apk/res/android" android:sharedUserId="my.app" ... >
(它没有记录,但共享用户ID需要是一个至少有一个点分隔符的字符串)
其余的很简单,您不需要乱用数据库路径。只需在两个应用程序中使用相同的DBAdapter。在托管数据库的应用程序中,使用本机上下文调用DBAdapter。
DBadapter hostDBAdapter = new DbAdapter(getApplicationContext());
performerDBadapter.open();
在第二个应用程序中,使用数据库托管应用程序的上下文访问数据库 首先,定义共享上下文:
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;
}
然后使用共享上下文打开DBAdapter:
DbAdapter sharedDBadapter = new PerformerDbAdapter(sharedContext);
sharedDBadapter.open();
最后请注意,如果您的数据库存在于清单中设置共享用户ID之前,则需要在物理设备上卸载/重新安装应用程序,以免您将自己锁定在数据库之外(sqlite error 14 )。另一方面,模拟器可能会更宽容。最重要的是,如果您的应用程序在Android市场上发布,那么在事后的想法中设置共享用户ID将无效。
希望这有帮助。
答案 1 :(得分:5)
数据库路径对于每个应用程序都是私有的,据我所知,它不可能直接跨应用程序访问它。
然而,一种方法是一个应用程序使用ContentProvider使另一个应用程序可以访问另一个应用程序。看看这是否适合你。
内容提供商存储和检索数据并使其可访问 所有申请。它们是分享数据的唯一方式 应用;所有Android套餐都没有通用的存储区域 可以访问。
答案 2 :(得分:1)
只要在两个应用程序上使用相同的证书,您的应用程序将在相同的进程上运行,并且表现为同一个应用程序 检查android文档的这一部分 http://developer.android.com/tools/publishing/app-signing.html#strategies