使用root-access在Android上打开另一个应用程序的sqlite-database

时间:2013-04-22 08:44:52

标签: android sqlite root

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

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

提前致谢

拜伯

3 个答案:

答案 0 :(得分:6)

感谢所有答案! 我认为唯一的方法是制作这样的东西:

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

然后,我必须使用cvs解析器解析OutputStream,.... 我希望我能以更简单的方式做到这一点,但我认为没有解决方案。

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

感谢您的帮助

拜伯

答案 1 :(得分:0)

如果您通过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
            );

答案 2 :(得分:-1)

如果这两个应用在“清单”中的sharedUsersId标记具有相同的值,则您不需要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);

然后你可以在DB适配器等中使用它:

class DBHelper extends SQLiteOpenHelper {

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

}

DBHelper dbHelper = new DBHelper (sharedContext);