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

时间:2011-11-21 15:52:29

标签: 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");

    }

1 个答案:

答案 0 :(得分:0)

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

    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块中,然后在catch中,你需要放e.printStackTrace();然后如果抛出错误,你可以看一下来自logcat的错误,以确定代码失败的位置,而不是每隔几行使用一次日志。

而且,在你的Manifest中你必须获得以下许可:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
相关问题