Копирование / резервное копирование базы данных на SD-карту Android - PullRequest
1 голос
/ 21 ноября 2011

Я использую этот код, и он продолжает получать только строку выходного файла и затем выдает исключение. Кто-нибудь может увидеть, что проблема может быть с этой строкой?

    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 голосов
/ 22 ноября 2011

Я сомневаюсь, что это является причиной вашей проблемы, но следующие две строки:

    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);

Это потому, что каталоги sdcard и data могут находиться в разных местах на разных телефонах. И часто вам нужно сделать /mnt/sdcard/ для ссылки на SD-карту, но лучше всего использовать Files и использовать Environment, как я показал выше.

Вам, конечно, нужно поместить все это в блок try, как у вас уже есть, а затем в рамках catch вам нужно будет поставить e.printStackTrace();, а затем, если выдается ошибка, вы можете посмотреть ошибки logcat, чтобы определить, где ваш код дает сбой, вместо использования журнала каждые несколько строк.

И, в вашем Манифесте вы должны иметь следующее разрешение:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...