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

标签 android database sqlite sharing

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

最佳答案

更新:下面描述的方法依赖于 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。在托管数据库的应用程序中,使用 native 上下文调用 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();

最后一点,如果您的数据库在 list 中设置共享用户 ID 之前就已存在,您将需要在物理设备上卸载/重新安装应用程序,以免您将自己锁定在数据库之外(sqlite 错误 14 ).另一方面,模拟器可能会更宽容。底线是,如果您的应用程序在 Android 市场上发布,事后设置共享用户 ID 是行不通的。

希望这对您有所帮助。

关于android - 在 2 个 Android 应用程序之间共享 SQLite 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49534456/

相关文章:

android - 动画图像裁剪

python - 在 Django 中获取数据到 SQLite 数据库

服务列表的 MySQL 数据库设计

android - Assets 文件夹中的数据库文件。会更新吗?

ruby-on-rails - Sqlite where 子句不起作用(这是一个错误吗?)

javascript - 媒体插件错误代码 : 1

android - Android 内存不足错误

android - 自定义垂直抽屉导航

sql - 在 Vertica 中将 MAC 地址转换为整数

java - 具有相同数据/列但表名不同的 Hibernate 和表