Поврежденный файл создается с помощью FileInputStream и outtream: java, android - PullRequest
1 голос
/ 07 марта 2019

В настоящее время я работаю над реализацией функции резервного копирования SQlite в моем приложении с помощью stream.Когда я делаю резервную копию базы данных, она работает, и файл содержит данные, как я это проверил через «Db browser for SQlite».Но когда я пытаюсь восстановить через FilOuputStream из пути к базе данных моего приложения и InputStream из возвращенного UrI с помощью android SAF (Структура доступа к хранилищу), указывающего на внешнее хранилище, куда я поместил резервную копию базы данных, я получаю поврежденный файл базы данных, и соединение также закрывается.

Ниже приведены два метода, которые я использую для этой цели

Создание резервной копии

   //back db to a URI
public synchronized static boolean backupDb(Context context, Uri uri, String dbNam) throws IOException {
    File dbFile = new File(context.getDatabasePath(dbNam).getPath());
    FileInputStream inFilStream = new FileInputStream(dbFile);
    OutputStream outFilStream = context.getContentResolver().openOutputStream(uri);//new FileOutputStream(backupFile);
    byte[] buffer = new byte[1024];
    int length;
    while ((length = inFilStream.read(buffer)) > 0) {
        outFilStream.write(buffer, 0, length);
    }
    outFilStream.flush();
    outFilStream.close();
    inFilStream.close();
    return true;
}

Восстановление резервной копии

  //restore db from a URI
public static synchronized boolean restoreBackup(Context context, Uri uri, String dbNam) {
    try {
        InputStream inFilStream = context.getContentResolver().openInputStream(uri);
        File dbFile = new File(context.getDatabasePath(dbNam).getPath());
        FileOutputStream outFilStream = new FileOutputStream(dbFile);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = inFilStream.read(buffer)) > 0) {
            outFilStream.write(buffer, 0, length);
            Log.wtf("db", "restoring backup up");
        }
        outFilStream.flush(); 
     // using outFilStream.getFD().sync(); also not working
        outFilStream.close();
        inFilStream.close();
        return true;
    } catch (IOException e) {
        return false;
    }
}

Журнал

enter image description here

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...