Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 无根访问数据库_Android_Database - Fatal编程技术网

Android 无根访问数据库

Android 无根访问数据库,android,database,Android,Database,我已经进行了大量的搜索,试图找到一种不用安卓手机就可以访问db的方法,但都是徒劳的。我不想使用AVD,因为它非常慢。但为了查看我在做什么,我需要以某种方式从PC或手机访问app.db文件 /data/data//databases/.db不适用于实际设备 因此,请向我推荐一些查看数据库的方法。在应用程序中创建一个函数,将数据库从内部(受保护)内存复制到外部(不受保护),如SD卡。然后,您可以使用PC访问数据库(如果愿意,甚至可以从设备本身使用Android DB reader)。在应用程序中创建

我已经进行了大量的搜索,试图找到一种不用安卓手机就可以访问db的方法,但都是徒劳的。我不想使用AVD,因为它非常慢。但为了查看我在做什么,我需要以某种方式从PC或手机访问app.db文件

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


因此,请向我推荐一些查看数据库的方法。

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

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

只需在你的应用程序中添加特定事件的代码,它就会将DB复制到SD卡中,这将是你的DB/数据的副本,而不是实际的DB。从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) {

    }

只需在应用程序中添加特定事件的代码,它将DB复制到SD卡中,它将是ur DB/数据的副本,而不是实际的DB。从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) {

    }

以下是我认为您需要的代码:

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) {
            }

我希望这能有所帮助。

以下是我认为您需要的代码:

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) {
            }

我希望这会有所帮助。

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

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如何管理其数据有关。

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

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如何管理其数据有关。

我试过这个。。私有静态最终字符串数据库_NAME=Environment.getExternalStorageDirectory().getPath();但是它不起作用。。你能给我一段代码吗?阿姆鲁特:请给我更多的启发。告诉我代码或方法。我现在不能谷歌。在过去的两天里,我一直在搜索4个项目&我没有找到任何有效的项目。我尝试了这个。。私有静态最终字符串数据库_NAME=Environment.getExternalStorageDirectory().getPath();但是它不起作用。。你能给我一段代码吗?阿姆鲁特:请给我更多的启发。告诉我代码或方法。我现在不能谷歌。在过去的两天里,我一直在找4本书&我没有找到任何有用的。布莱恩:谢谢你的帮助。但你的方法行不通。它显示的错误与我第一次尝试将数据存储在SD卡本身时显示的错误相同。您可以发布错误(catlog)吗?我的大多数项目中都有这段代码,而且效果很好。我一按按钮就用它。如果你想给我发一封电子邮件,我会把我使用这段代码的整个班级发给你,这可能会对你有所帮助。电子邮件地址是罗马的。appsllc@gmail.comBrian:谢谢你的帮助。但你的方法行不通。它显示的错误与我第一次尝试将数据存储在SD卡本身时显示的错误相同。您可以发布错误(catlog)吗?我的大多数项目中都有这段代码,而且效果很好。我一按按钮就用它。如果你想给我发一封电子邮件,我会把我使用这段代码的整个班级发给你,这可能会对你有所帮助。电子邮件地址是罗马的。appsllc@gmail.comIt实际上,对于您自己的应用程序是可能的,请参见