在两个Android应用程序之间共享SQLite数据库?

问题描述 投票:52回答:3

我需要在2个应用程序之间共享一个数据库。我知道数据库将在/ data / data / MY_PACKAGE / databases /上创建。由于包名称不同,我可以在任一应用程序上创建数据库时定义一个包名的路径吗?谢谢。

android database sqlite sharing
3个回答
82
投票

您当然可以在2个应用程序之间共享一个数据库。

为了在应用程序之间共享数据(前提是它们由同一发布者发布),您需要在两个应用程序的AndroidManifest.xml中指定共享用户ID。

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

(它没有文档,但共享用户标识必须是一个至少有一个点分隔符的字符串)

其余的很简单,您不需要乱用数据库路径。只需在两个应用程序中使用相同的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错误14)。另一方面,模拟器可能会更宽容。最重要的是,如果您的应用程序在Android市场上发布,那么在事后的想法中设置共享用户ID将无效。

希望这可以帮助。


5
投票

数据库路径对于每个应用程序都是私有的,据我所知,它不可能直接跨应用程序访问它。

然而,一种方法是一个应用程序使用ContentProvider使另一个应用程序可以访问它的数据库。看看这是否适合你。

内容提供商存储和检索数据并使其可供所有应用程序访问。它们是跨应用程序共享数据的唯一方式;所有Android软件包都无法访问的公共存储区域。


1
投票

只要您在两个应用程序上使用相同的证书,您的应用程序将在相同的进程上运行并表现为同一个应用程序检查这部分的android文档http://developer.android.com/tools/publishing/app-signing.html#strategies

© www.soinside.com 2019 - 2024. All rights reserved.