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

Java 将数据库复制/备份到SD卡Android,java,android,sqlite,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 b

我正在使用这段代码,它只会一直到达输出文件行,然后抛出异常。有人能看出这句话可能有什么问题吗

    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卡,但最好的方法仍然是使用文件和使用
环境,如我上面所示

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

并且,在您的舱单中,您必须具有以下权限:

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


请您将异常堆栈跟踪放在捕获异常的位置,您应该执行
e.printSatckTrace()
然后将日志输出添加到您的答案中。这样我们可以看到实际抛出的错误。无论何时引用Eduardo,都应该使用环境:
Environment.getExternalStorageDirectory()
。然后对为sdcard返回的文件调用
getAbsolutePath()
。谢谢@Jakar。请给出一个如何执行此操作的示例。我将在上面的评论中包括这一痕迹,我说的是“爱德华多”。那应该是SD卡。我当时在用手机,所以它会自动更正。哈哈.)