在 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 数据库?的主要内容,如果未能解决你的问题,请参考以下文章
2个RecyclerViews之间的Android共享元素转换