4

我想打开另一个应用程序的数据库。我知道我必须具有 root 访问权限,但似乎 root 访问权限“仅”用于 shell 命令。

我想在数据库中进行很多选择和一些插入。是否可以以 root 身份打开数据库,并在“普通”应用程序中使用数据库句柄?

提前致谢

比伯

4

3 回答 3

7

感谢所有答案!我认为唯一的方法是做这样的事情:

Process p = Runtime.getRuntime().exec("su sqlite3 -csv test.db \"select * from test\";");

然后,我必须用 cvs 解析器解析 OutputStream,.... 我希望我能以更简单的方式来做,但我看不到解决方案。

也许我可以在我的应用程序目录中创建指向文件的硬链接,但这非常危险,因为这样一个数据库就有两个“.journal”文件。

感谢帮助

比伯

于 2013-04-23T12:18:02.827 回答
1

如果您通过 shell 命令具有 root 访问权限,您仍然可以访问数据库:

例子 :

mycomp$ adb shell
$ su
# cd com.android.providers.media
# ls
cache
databases
lib
shared_prefs
# cd databases
# ls
external.db
external.db-shm
external.db-wal
internal.db
internal.db-shm
internal.db-wal
# sqlite3 external.db
SQLite version 3.7.11 2012-03-20 11:35:50
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select count(*) from images;
10
sqlite> 

使用的工具是 sqlite3,它是 sqlite 数据库的客户端命令。数据库文件通常位于 /data/data/com.someapp/databases/。

编辑:等等......我正在阅读你的问题。你的意思是你想从你自己的应用程序访问另一个应用程序的数据库?

编辑:如果你想访问另一个数据库,另一个数据库必须是内容提供者。最好的例子是媒体库(上面的图像表是包含设备中图片的表)。代码示例:

 // which image properties are we querying
 String[] projection = new String[] { BaseColumns._ID, ImageColumns.BUCKET_DISPLAY_NAME, ImageColumns.DATE_TAKEN, MediaColumns.TITLE, MediaColumns.DATA };

 // Get the base URI for the image table in the Contacts content provider.
 Uri images = MediaStore.Images.Media.EXTERNAL_CONTENT_URI;

 // Make the query.
 Cursor cur = context.managedQuery(images, projection, // Which columns to return
            "", // Which rows to return (all rows)
            null,//selection, // Selection arguments (none)
            ImageColumns.DATE_TAKEN + " DESC"// Ordering
            );
于 2013-04-22T09:04:16.137 回答
-1

sharedUsersId如果这两个应用程序在 Manifest 中具有相同值的标签,则不需要 root 访问权限和 shell :

<manifest
  xmlns:android="http://schemas.android.com/apk/res/android" 
  android:sharedUserId="app.you.want.to.share"
>

在应用程序中,您想要访问app.you.want.to.share应用程序的地方必须创建一个上下文:

Context sharedContext = createPackageContext ("app.you.want.to.share", Context.CONTEXT_INCLUDE_CODE);

然后您可以在数据库适配器等中使用它:

class DBHelper extends SQLiteOpenHelper {

    DBHelper (Context context) {
      super (context, "db", null, 1);
    }

}

DBHelper dbHelper = new DBHelper (sharedContext);
于 2017-09-09T22:00:25.643 回答