java - 将数据库复制/备份到 SD 卡 Android

标签 java android sqlite

我正在使用这段代码,它只持续到达输出文件行并抛出异常。谁能看出这一行可能有什么问题吗?

    try{

        Log.e("Trying","try");
    // Local database
    InputStream input = new FileInputStream("/data/data/package/databases/database");
    Log.e("Input","in");
    // create directory for backup

    // Path to the external backup
    OutputStream output = new FileOutputStream("/sdcard/android/package/databases/mydatabase.db");

    Log.e("Output","out");

    // transfer bytes from the Input File to the Output File
    byte[] buffer = new byte[1024];

    Log.e("Buffer","Buff");
    int length;
    while ((length = input.read(buffer))>0) {
        output.write(buffer, 0, length);
    }

    Log.e("After While","try");
    output.flush();
    output.close();
    input.close();
    } catch (IOException e) {

        throw new Error("Copying Failed");

    }

最佳答案

我怀疑这是问题的原因,但以下两行:

    OutputStream output =  new FileOutputStream("/sdcard/android/package/databases/mydatabase.db");
    InputStream input = new FileInputStream("/data/data/package/databases/database");

应该变成:

    File sdcard = Environment.getExternalStorageDirectory();
    File outputFile = new File(sdcard, "android/package/databases/mydatabase.
    File data = Environment.getDataDirectory();
    File inputFile = new File(data, "data/package/databases/database");

    InputStream input = new FileInputStream(inputFile);
    OutputStream output = new FileOutputStream(outputFile);

这是因为不同手机上的SD卡和数据目录可能位于不同的位置。通常,您需要执行 /mnt/sdcard/ 来实际引用 sd 卡,但最好的方法仍然是使用文件并使用 Environment,如我上面所示。

您当然需要将其全部放入 try block 中,就像您已经拥有的那样,然后在 catch 中,您需要放入 e.printStackTrace(); ,然后如果出现错误抛出时,您可以查看 logcat 中的错误来确定代码失败的位置,而不是每隔几行使用日志。

并且,在您的 list 中,您必须拥有以下权限:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

关于java - 将数据库复制/备份到 SD 卡 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8214512/

相关文章:

java - 如何在JDBC 中执行不带参数的存储过程?

android - Gradle 同步失败 : Could not resolve all artifacts for configuration

android - 在Android开发中,这个: "The debugger and garbage collector are currently loosely integrated."有什么含义

.net - SQLite with Powershell - SQLite Datatyp Date 正在 Powershell 中转换为 DateTime

python - sqlite + PyQt5 到独立 exe - Python 3.6.3 + Pyinstaller

android - SQLite 在 TEXT 数据类型上执行 Between

java - 单击搜索按钮后 JList 不填充

java - 使用一个文本字段中的值到另一个文本字段中

java - Java中通过socket发送打印机命令

android - 如何使用 sbt 运行 Android 测试?