无需root权限访问数据库

时间:2013-01-11 18:46:26

标签: android database

我已经徒劳地搜索了一个方法来找到一个方法来访问数据库而不需要root我的Android手机。我不想使用AVD,因为它非常慢。但是为了看看我在做什么,我需要从PC或手机访问我的应用程序.db文件。

/data/data//databases/.db不适用于真实设备。

所以,请建议我使用一些方法来查看我的数据库。

4 个答案:

答案 0 :(得分:2)

在您的应用中创建一个功能,将数据库从内部(受保护)内存复制到外部(不受保护),如SD卡。然后,您可以使用PC(或者如果您愿意,甚至可以从设备本身访问Android DB阅读器)访问它。

答案 1 :(得分:2)

只需在您的应用程序中添加特定事件的代码,它就会将数据库复制到SD卡中,它将是您的数据库/数据的副本,而不是实际的数据库。从SD卡,您始终可以访问数据库。 这是工作,但它对我有用。

这是代码

    try {
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();
        if (sd.canWrite()) {
            String currentDBPath = "data/"+sPackageName+"/databases/"+sDBName;
            String backupDBPath = "/.appname-external-data-cache/"+sDBName; //"{database name}";
            File dir = new File(sd,backupDBPath.replace(sDBName,""));
            if(dir.mkdir()) {

            }
            File currentDB = new File(data, currentDBPath);
            File backupDB = new File(sd, backupDBPath);
            if (currentDB.exists()) {
                FileChannel src = new FileInputStream(currentDB).getChannel();
                FileChannel dst = new FileOutputStream(backupDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
            }
        } 

   } catch (Exception e) {

    }

答案 2 :(得分:0)

以下是我认为你想要的代码:

try {
                // Backup of database to SDCard
                db.open();
                File newFile = new File(Environment.getExternalStorageDirectory(), "BackupFileNameHere");
                InputStream input = new FileInputStream("/data/data/com.YourProjectName/databases/DatabaseNameHere");
                OutputStream output = new FileOutputStream(newFile);

                // transfer bytes from the Input File to the Output File
                byte[] buffer = new byte[1024];
                int length;
                while ((length = input.read(buffer))>0) {
                    output.write(buffer, 0, length);
                }
                output.flush();
                output.close();
                input.close();
                db.close();

            } catch (Exception e) {
            }

我希望这会有所帮助。

答案 3 :(得分:0)

我们只是将应用程序内的所有用户的文件权限设置为可读。

if (BuildConfig.DEBUG)
{
     new File(mDB.getPath()).setReadable(true, false);
}

然后使用adb -pull

获取.db
adb -d pull //data/data/xxxxx/databases/xxxxx.db .

注意:我发现每次打开数据库文件时都需要这样做,例如在onCreate以及SQLiteOpenHelper包装器的构造函数中(当您的数据库是不是null)或者也许onOpen。如果仅在onCreate中,则下次运行应用程序且.db已存在时,由于某种原因,权限已更改回来。这可能与Android如何管理其数据有关。