在 2 个 android 应用程序之间共享 SQLite 数据库?

Posted

技术标签:

【中文标题】在 2 个 android 应用程序之间共享 SQLite 数据库?【英文标题】:Share SQLite database between 2 android apps? 【发布时间】:2011-10-26 14:20:34 【问题描述】:

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

【问题讨论】:

groups.google.com/group/android-developers/browse_thread/thread/… 这个线程是关于类似的东西;看看有没有帮助 【参考方案1】:

更新:下面描述的方法依赖于android:sharedUserId,自 API 级别 29 (Android 10) 起已弃用。

您当然可以在 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 错误 14 )。另一方面,模拟器可能会更宽容。归根结底,如果您的应用在 Android 市场上发布,那么事后设置共享用户 ID 是行不通的。

希望这会有所帮助。

【讨论】:

这是很棒的帮助,但仍然给我留下了一个问题 - 即,如何在卸载“第一个”应用程序时防止丢失数据库。请参阅link。 没错,不是“官方”的方式。我认为,Android 文档建议 Content Providers 在应用程序之间共享数据。这更像是一个 hack(一个方便的)。 我同意Daniel,官方的方式是Content Providers。我会鼓励大家不要诉诸于像现在内容提供者有据可查和理解的黑客,并且有很多例子等等。 我正在尝试对 Eclipse 中构建的 2 个 Android 应用程序做同样的事情。您是否还必须将“DBadapter”的源文件包含在两个 App 项目中? 我不明白什么是 DbAdapter 或 PerformerDbAdapter,我在 android API 中看不到这样的类。请澄清【参考方案2】:

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

但是,一种方法是一个应用程序使用ContentProvider 使其数据库可供另一个应用程序访问。看看这是否适合你。

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

【讨论】:

【参考方案3】:

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

【讨论】:

在你遇到冲突之前共享一个数据库是好的,最终我不得不放弃这个并采用更好的数据库提供程序设计。让一个应用程序创建提供程序,然后两个应用程序可以向同一个提供程序发送请求。现在您有了一个管理类,可以指示数据库何时锁定。

以上是关于在 2 个 android 应用程序之间共享 SQLite 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 应用程序之间共享不可变文件

2个RecyclerViews之间的Android共享元素转换

在 Android 应用程序之间共享文件? [关闭]

Android - 服务是不是在进程之间共享?

Flutter iOS 文本字符串在 2 个 Flutter 应用程序之间共享

ios - 在应用程序之间共享数据,但链接到 Apple ID