Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何读取另一个应用程序的数据库_Java_Android_Database_Sqlite - Fatal编程技术网

Java 如何读取另一个应用程序的数据库

Java 如何读取另一个应用程序的数据库,java,android,database,sqlite,Java,Android,Database,Sqlite,我正在根设备上工作。 我已经从我的pc连接了adb外壳,我可以验证另一个数据库是否存在,并且可以查询它的表 然而,在我的java代码中,当我试图打开数据库时,我得到了一个错误 android.database.sqlite.SQLiteException:无法打开数据库文件 我正在尝试如下方式打开数据库: SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READONLY); 路径类似于/data/data/com.xxx.

我正在根设备上工作。 我已经从我的pc连接了adb外壳,我可以验证另一个数据库是否存在,并且可以查询它的表

然而,在我的java代码中,当我试图打开数据库时,我得到了一个错误

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

我正在尝试如下方式打开数据库:

SQLiteDatabase.openDatabase(PATH, null, SQLiteDatabase.OPEN_READONLY);
路径类似于/data/data/com.xxx.xxx/databases/xx.db

我应该阅读其他应用程序的数据库吗?还是有其他方法

更新: 我还试着按照这个帖子中的建议制作系统应用程序


我认为它是有效的,因为应用程序不能像普通应用程序那样从应用程序管理器中卸载,所以我认为它是一个系统应用程序。但是我仍然无法访问数据库,尽管我确信路径和权限是正确的。

我假设数据库文件的权限设置为您的应用程序没有访问权限。即使您的设备是根用户,也不意味着您的应用程序以根用户身份运行。

默认情况下,Android操作系统不允许应用程序访问彼此的私人文件夹。要能够读取其他应用程序文件夹中的文件,请执行以下操作之一:

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

android:sharedUserId="com.xx.xx"

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

这是因为应用程序需要root用户,并且需要更改您试图访问的数据库的权限,以便您能够实际访问它。您需要做的是,作为root用户,更改数据库的权限,以便每个人都可以访问它,在数据库上执行您希望执行的操作,关闭数据库并将权限更改回来

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


您能否提供有关您的环境的更多详细信息,例如操作系统等。您使用的语言以及您希望访问的数据库类型?@Deepend这显然是Android和Java。检查标签。感谢@Caner的回复。我所做的是从名为Root Browser的商店下载一个应用程序,并将.apk复制到/system/app,然后重新启动,该应用程序确实已安装,但结果相同。我仔细检查了db路径是否相同。我使用的是一款根HTC Desire HD和Cyanogenmod。我还通过根浏览器应用程序授予了/system/app文件夹中apk的所有权限。打开shell并执行
su
,然后尝试
chown Root.Root/system/app/your.apk
。不幸的是,这也没有帮助,根浏览器应用程序正确地显示apk的所有者是Root,但这不会改变任何东西。有趣的是,一旦我将.apk复制到/system/app文件夹,应用程序就会自动安装,无需重新启动(尽管我也尝试重新启动设备)。下面是stacktrace中有趣的几行:sqlite返回:错误代码=14,msg=无法打开[42537b6056]sqlite3_open_v2的第27205行的文件(“/data/data/com.facebook.katana/databases/fb.db”,&handle,1,NULL)failedi不知道:(也许这会有帮助:您可以尝试将数据库复制到您可以访问的某个文件夹。最后,这就是我结束的操作,它可以工作字符串[]hin={“su”、“-c”、“cp/data/data/com.xxx.xxx/databases/xx.db/sdcard/xx.db”};Runtime.getRuntime().exec(hin);从那里我可以访问.db。现在我有另一个问题,但我会为它创建一个新的线程。谢谢!谢谢@David Wasser,但如果我在.apk上使用chown,这不会使应用程序以root身份运行吗?如果它以root身份运行,我还可能无法访问数据库吗?好问题。我不太喜欢使用root手机,所以我想我在这里帮不了你。对不起。你应该可以通过使用
adb shell
ps
命令查看你的应用程序是否以root用户身份运行,该命令应该显示每个进程运行时的用户ID。