Banco de dados de importação e exportação não funciona no Pie Android

ItsRedwan:

Abaixo está o método de trabalho de banco de dados de importação e exportação SQLite. Sua muito bem trabalho em todas as versões do Android excluindo Pie Android. Quando eu estou tentando importação na torta Android, mostra brinde bem sucedida, mas banco de dados não está sendo restaurado. Alguém pode me ajudar resolver em Pie Android (API 28).

private void importDB() {

    try {
        File sd = Environment.getExternalStorageDirectory();
        File cur_db_pat = new File(this.getDatabasePath(DATABASE_NAME).getAbsolutePath());

        if (sd.canWrite()) {
            String backupDBPath = bac_dir_nam +"/" + DATABASE_NAME;
            File currentDB = new File(sd, backupDBPath);

            FileChannel src = new FileInputStream(currentDB).getChannel();
            FileChannel dst = new FileOutputStream(cur_db_pat).getChannel();
            dst.transferFrom(src, 0, src.size());
            src.close();
            dst.close();
            Toast.makeText(getBaseContext(), cur_db_pat.toString(),
                    Toast.LENGTH_LONG).show();
        }
    } catch (Exception e) {

        Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
                .show();

    }
}

private void exportDB() {

    try {
        File sd = Environment.getExternalStorageDirectory();
        File cur_db_pat = new File(this.getDatabasePath(DATABASE_NAME).getAbsolutePath());

        if (sd.canWrite()) {
            String backupDBPath = bac_dir_nam+"/" + DATABASE_NAME;
            File backupDB = new File(sd, backupDBPath);

            FileChannel src = new FileInputStream(cur_db_pat).getChannel();
            FileChannel dst = new FileOutputStream(backupDB).getChannel();
            dst.transferFrom(src, 0, src.size());
            src.close();
            dst.close();
            Toast.makeText(getBaseContext(), backupDB.toString(),
                    Toast.LENGTH_LONG).show();

        }
    } catch (Exception e) {

        Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG)
                .show();

    }
}

Eu não tenho muita experiência com sistema de arquivos. Então, um exemplo ajudaria muito.

Mike:

Em Android Pie + SQLite mudou para o padrão de usar o geralmente mais eficiente Logging Write Ahead ( WAL ) em vez do modo Journal.

Como tal, haverá dois arquivos com o mesmo nome que o banco de dados, mas com o sufixo -shm (arquivo de memória compartilhada) e -wal (log frente write) e sua presença é o que eu acredito que provoca o problema (s). Arquivos temporários usados por SQLite (ver 2.2 e 2.3)

Uma correção seria desabilitar o log Write Ahead usando uso do SQLiteDatabase disableWriteAheadLogging método e o método anterior iria funcionar como antes, mas com o modo periódico menos eficiente.

  • (se utilizando uma subclasse de SQliteOpenHelper então substituir o onConfigure método para chamar este método.) disableWriteAheadLogging .

Outra correção é excluir esses dois arquivos ao restaurar. Para evitar o potencial de corrupção você tem que garantir que o banco de dados foi adequadamente checkpointed antes de fazer o backup. veja PRAGMA checkpoint;

O seguinte é um trecho que exclui esses dois arquivos durante a restauração (observando que o backup é assumido ter sido tomada com checkpointing adequada): -

                    // Added for Android 9+ to delete shm and wal file if they exist
                    File dbshm = new File(dbfile.getPath() + "-shm");
                    File dbwal = new File(dbfile.getPath()+ "-wal");
                    if (dbshm.exists()) {
                        dbshm.delete();
                    }
                    if (dbwal.exists()) {
                        dbwal.delete();
                    }

Outra correção seria adicionalmente backup e posteriormente restaurar o -shm e arquivos -wal.

Você também pode querer considerar os benefícios potenciais de renomear os arquivos originais ao importar / restauração, verificando os novos arquivos depois que eles foram copiados (por exemplo, usando PRAGMA integrity_check; ) Se os resultados indicad sem problemas, em seguida, apagar os arquivos originais renomeados, caso contrário, excluir a arquivos importados e renomear os arquivos originais para o seu nome original, indicando que a importação falhou.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=177224&siteId=1
Recomendado
Clasificación