我想打开另一个应用程序的数据库。我知道我必须具有 root 访问权限,但似乎 root 访问权限“仅”用于 shell 命令。
我想在数据库中进行很多选择和一些插入。是否可以以 root 身份打开数据库,并在“普通”应用程序中使用数据库句柄?
提前致谢
比伯
感谢所有答案!我认为唯一的方法是做这样的事情:
Process p = Runtime.getRuntime().exec("su sqlite3 -csv test.db \"select * from test\";");
然后,我必须用 cvs 解析器解析 OutputStream,.... 我希望我能以更简单的方式来做,但我看不到解决方案。
也许我可以在我的应用程序目录中创建指向文件的硬链接,但这非常危险,因为这样一个数据库就有两个“.journal”文件。
感谢帮助
比伯
如果您通过 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
);
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);