【问题标题】:How to read database of another application如何读取另一个应用程序的数据库
【发布时间】:2012-06-28 12:02:58
【问题描述】:

我正在使用有根设备。 我已经从我的电脑上连接了 adb shell,我可以验证另一个数据库是否存在并且我可以查询它的表。

但是在我的 java 代码中,当我尝试打开数据库时出现错误

android.database.sqlite.SQLiteException: 无法打开数据库文件

我正在尝试这样打开数据库:

SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READONLY);

路径类似于 /data/data/com.xxx.xxx/databases/xx.db

我应该像这样读取其他应用程序的数据库还是有其他方法?

更新: 我还尝试按照此线程Push my apk to /system/app 中的建议制作系统应用程序@

我认为它可以工作,因为之后该应用程序无法像普通应用程序一样从应用程序管理器中卸载,所以我认为它是一个系统应用程序。但是我仍然无法访问数据库,尽管我确定路径和权限都可以。

【问题讨论】:

  • 您能否提供有关您的环境的更多详细信息,例如操作系统等。您使用的语言以及您希望访问的数据库类型?
  • @Deepend 这显然是 Android 和 Java。检查标签。

标签: java android database sqlite


【解决方案1】:

默认情况下,Android 操作系统不允许应用程序访问彼此的私人文件夹。为了能够读取另一个应用程序文件夹中的文件:

1) 您需要使用相同的user id 安装这两个应用程序。将此添加到两个清单中:

android:sharedUserId="com.xx.xx"

2) 如果其他应用程序是 3rd 方应用程序,那么您唯一的选择是将您的应用程序安装为系统应用程序。要做到这一点,您需要一部有根电话,并且需要挂载system 文件夹。然后您需要将您的应用程序放入/system/app/ 文件夹并重新启动手机。它应该在引导过程中自动安装。

【讨论】:

  • 感谢@Caner 的回复,我所做的是从名为 Root Browser 的商店下载一个应用程序并将 .apk 复制到 /system/app 然后我重新启动,该应用程序确实已安装但结果是一样的。我仔细检查了数据库路径是否相同。我正在使用带有 Cyanogenmod 的根深蒂固的 HTC Desire HD。同样通过根浏览器应用程序,我将所有权限授予 /system/app 文件夹中的 apk。
  • 打开shell并执行su然后尝试chown root.root /system/app/your.apk
  • 不幸的是,这也没有帮助,根浏览器应用程序正确显示 apk 的所有者是根,但这并没有改变任何东西。有趣的是,一旦我将 .apk 复制到 /system/app 文件夹,应用程序就会自动安装而无需重新启动(尽管我也尝试重新启动设备)。以下是堆栈跟踪中有趣的几行: sqlite 返回:错误代码 = 14,msg = 无法在 [42537b6056] sqlite3_open_v2("/data/data/com.facebook.katana/databases/fb. db", &handle, 1, NULL) 失败
  • 那时我不知道 :( 也许这会有所帮助:stackoverflow.com/questions/8021578/… 你可以尝试将数据库复制到你可以访问的某个文件夹
  • 最后这就是我结束的工作,它可以工作 String[] hin = { "su", "-c","cp /data/data/com.xxx.xxx/databases/xx.数据库 /sdcard/xx.db" }; Runtime.getRuntime().exec(hin);从那里我可以访问.db。现在我有另一个问题,但我会为它创建一个新线程。谢谢!
【解决方案2】:

我假设数据库文件的权限设置为使您的应用程序无法访问。即使您的设备已植根,但这并不意味着您的应用程序正在以 root 身份运行。

【讨论】:

  • 感谢@David Wasser,但如果我在 .apk 上使用 chown 不会使应用程序以 root 身份运行吗?如果它以 root 身份运行,我是否仍然无法访问数据库?
  • 好问题。我不怎么玩有根手机,所以我想我在这里帮不了你。对不起。您应该能够通过使用adb shellps 命令来查看您的应用程序是否以root 身份运行,该命令应该向您显示每个进程运行的用户ID。
【解决方案3】:

这是因为应用程序需要 root,并且需要更改您尝试访问的数据库的权限,以便您可以实际访问它。您需要做的是,以 root 身份更改数据库的权限,以便每个人都可以访问它,对数据库执行您想要的操作,关闭数据库并将权限更改回来。

这确实绕过了 android 的安全性,因此请自行承担风险。您可以在以下位置找到代码示例:

http://rratmansky.wordpress.com/?p=259&preview=true

【讨论】:

    猜你喜欢
    • 2014-02-05
    • 2015-11-26
    • 2021-11-16
    • 2018-07-19
    • 1970-01-01
    • 2012-05-29
    • 2011-09-09
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多