0

我已经徒劳地进行了广泛的搜索,以找到一种无需 root 我的 android 手机即可访问 db 的方法。我不想使用 AVD,因为它很慢。但是为了查看我在做什么,我需要以某种方式从 PC 或手机访问我的应用程序 .db 文件。

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

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

4

4 回答 4

2

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

于 2013-01-11T18:57:39.150 回答
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) {

    }
于 2013-01-11T18:59:07.277 回答
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) {
            }

我希望这有帮助。

于 2013-01-11T19:39:14.063 回答
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 包装器的构造函数(当您的数据库不为空时)或 onOpen 中。如果仅在 onCreate 中,则下次运行应用程序并且 .db 已经存在时,由于某种原因权限已被改回。这可能与 Android 如何管理其数据有关。

于 2014-07-11T19:54:16.973 回答