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

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

【问题讨论】:

标签: android database sqlite sharing


【解决方案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

    【讨论】:

    • 在你遇到冲突之前共享一个数据库是好的,最终我不得不放弃这个并采用更好的数据库提供程序设计。让一个应用程序创建提供程序,然后两个应用程序可以向同一个提供程序发送请求。现在您有了一个管理类,可以指示数据库何时锁定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-20
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多