我想打开另一个应用的数据库。 我知道我必须具有root访问权限,但似乎root访问权限仅适用于shell命令。
我想在数据库中进行大量选择和一些插入。 是否可以以root身份打开数据库,并在“普通”应用程序中使用db-handle?
提前致谢
拜伯
答案 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);