[RESOLVIDO] Como importar/exportar um arquivo da memória interna do celular para a memória externa do sistema do app no Android Studio?

faz um sout quando vc ler os dados do banco pra ver se ta lendo corretamente.

O problema inicial desse tópico foi resolvido?

é isso mesmo, vc quer trocar a pasta?

Eu quero copiar o arquivo que está na memória externa do celular para a pasta do sistema do app, onde está o banco de dados (exportado) Escola.db

é o que estamos fazendo:

Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP"

Se ele foi pra pasta do sistema do app, eu iria ver os alunos cadastrados na lista?

Se sim, pq eles não estão lá?

Será que não está, pq não foi copiado de fato?

faz isso

Desculpa a ignorância, mas oq é um sout?

que isso, eu que expliquei mal

se vc escrever sout e apertar a tecla tab em seguida, ele faz isso: System.out.println();


System.out.println("");

ah… SOP, eu aprendi SOP rssr… Sistem.Out.Println, certo, farei. Tem condições de continuarmos o post amanhã? Eu preciso ir… Pode ser?

ok

Ok, obg! Até amanhã.

1 curtida

Boa tarde! Voltei, orochimaru e a todos que possam ajudar!

Bom, dando continuidade… o Método para IMPORTAÇÃO que vc (orochimaru) me mandou é esse:

public String importarBanco(Context context) {
    String retorno = "null";

    String arquivoOrigem = Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP";
    String arquivoDestino= context.getApplicationInfo().dataDir + "/databases/Escola.db";

    InputStream in = null;
    OutputStream out = null;
    try {
        File dir = new File(arquivoDestino);// SEM USO

        in = new FileInputStream(arquivoOrigem);
        out = new FileOutputStream(arquivoDestino);

        byte[] buffer = new byte[1024];
        int leitor;
        while ((leitor = in.read(buffer)) != -1) {
            out.write(buffer, 0, leitor);
        }
        in.close();
        in = null;// SEM USO

        out.flush();
        out.close();
        out = null;// SEM USO
        return retorno = "UPLOAD REALIZADO COM SUCESSO!";
    }
    catch (FileNotFoundException e) {
        Log.e("tag", e.getMessage());
        return retorno = "UPLOAD NÃO REALIZADO!";
    }
    catch (Exception e) {
        Log.e("tag", e.getMessage());
        return retorno = "UPLOAD NÃO REALIZADO!";
    }
}

Vou falar brevemente da Exportação pra poder falar da IMPORTAÇÃO

O arquivo Exportado (CÓDIGO DA EXPORTAÇÃO AQUI) sempre tinha o meso tamanho independente da quantidade de alunos cadastrados, tipo, com 1 aluno salvo, ele apresentava o tamanho (16,38 KB), mas ao salvar 9 alunos, ele mantém o tamanho (16,38 KB). É como se ele salvasse o arquivo Escola.db , mas sem os dados (O conteúdo do banco). Enfim…

Fiz uns ajustes nele e ele agora tá salvando com o tamanho (20,48 KB), pensei que enfim ele tava salvando os dados, mas não! É o msm esquema, 1 ou 10 alunos ele sempre tem o msm tamanho (20,48 KB). Acredito que isso deveria mudar, pq de 1 pra 10 alunos, aumenta-se a quantidade de dados e seu tamanho também muda, mas ele não muda. (Se for o caso de discutir essa parte da Exportação no outro Tópico, é só falar que eu dou continuidade lá, pois quero saber se ele está de fato Exportando o arquivo com os Dados ou não)

A questão é que o código da IMPORTAÇÃO não está importando os dados do arquivo Escola.db . Ele importa o arquivo, mas sem os dados.

Lembrando que usei o SQLite para fazer o Banco de dados.

Oq está faltando para tal ação?

Grata e no aguardo de respostas.

oi, boa tarde, vc fez o sout quando começa a ler os dados?

Pra falar a vdd não. Estou me guiando pelos returns, com eles eu vejo se o try ou catch estão rodando, mas tipo, como vc usa os souts?

por falar de return, faz assim:

 retorno = "msg....."

e depois do ultimo catch, vc faz

 } catch (....){
 }
 return retorno;
}

Primeiro vc tem que saber onde vc começa a ler o banco de dados, aí vc coloca lá:

System.out.println("lendo arquivo: " + caminho_do_arquivo);

Tô fazendo os returns exatamente assim e imprimo num Toast em outra classe.
Tbm tô fazendo assim depois dos catchs.

Quanto à leitura do banco, tenho a classe ListarAlunos, nela eu tenho a relação de todos os alunos cadastrados. É assim que estou sabendo se o banco salvo está sendo importado pro sistema.

Na classe do Banco de Dados tenho os métodos de Exportação e Importação em que os resultados exibo nas classes BackupBanco e UploadBanco.

No caso, o sout que vc fala, seria colocado nos métodos Exprotar e Importar que estão no Banco?

Eles estão como vc colocou no método IMPORTAR.

Quando eu rodo os Métodos, eles dão esses resultados no run:

W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@ac2c01c
W/System: A resource failed to call close. 
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@4e88cc9
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@c7985d8
E/tag: /storage/emulated/0/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP (No such file or directory)
D/OpenGLRenderer: endAllActiveAnimators on 0x89dae600 (RippleDrawable) with handle 0x8a129970
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@55ebeed

Essa linha quando eu faço a Exportação:

W/System: A resource failed to call close.

E essa linha quando faço a Importação:

E/tag: /storage/emulated/0/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP (No such file or directory)

Onde dos Métodos vc quer colocar os soults?

lê os arquivos daqui:

/storage/emulated/0/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP (No such file or directory)

ve o que vai retornar

Desculpa, orochimaru, mas não tô sabendo como implementar isso, vai que é algo tão trivial, mas não to entendendo oq vc ta falando…

vou te mandar um dm.

Consegui!!

Consegui fazer a importação/exportação do banco de dados SQLite da memória interna para a externa e vice-versa.

Os dois métodos abaixo faz a msm coisa.

OBS: Na pasta /databases/ tem 3 arquivos e eu só consegui resgatar o banco de dados por completo quando copiei os 3 arquivos tanto para a memória externa como para interna. Nesse caso eu repeti as linhas para cada arquivo. Só assim que eu vi os alunos cadastrados de volta na minha lista (O único arquivo que mudava de tamanho com os cadastros dos alunos e que abriu o banco exibindo os alunos cadastrados na lista foi o arquivo Escola.db-wal, por isso que copiar todos os arquivos, vai que um tem relação com o outro neh).

 public void copiarBanco(){
      File pastaDestino = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/");

  // NA PASTA /databases/ CONTÉM 3 ARQUIVOS: Escola.db, Escola.db-shm e Escola.db-wal
  // ENTÃO COPIE TODOS, UM POR UM, PARA A MEMÓRIA EXTERNA
  // SÓ ASSIM QUE (AO FAZER O INVERSO, COPIAR DA MEMÓRIA EXTERNA PARA A INTERNA) EU PUDE VER OS ALUNOS CADASTRADOS NOVAMENTE NA LISTA DO MEU SISTEMA
      File arquivoOrigem = new File("//data/data/sistema.escola/databases/Escola.db");
      File arquivoDestino = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/BACKUP_APP_ESCOLA/Escola_backup.db");

      if(! pastaDestino.exists()){
           pastaDestino.mkdir();
           try{
                InputStream input = new FileInputStream(arquivoOrigem);
                OutputStream output = new FileOutputStream(arquivoDestino);

                byte[] buffer = new byte[1024];
                int length;

                while((length = input.read(buffer)) > 0){
                     output.write(buffer, 0, length);
                }

                input.close();
                output.close();

                Toast.makeText(MainActivity.this, "EXPORTAÇÃO REALIZADA COM SUCESSO!", Toast.LENGTH_SHORT).show();
           }
           catch(IOException e){
                Toast.makeText(MainActivity.this, "EXPORTAÇÃO NÃO REALIZADA!", Toast.LENGTH_SHORT).show();
           }
      }
 }

Segunda forma:

 public void copiarBanco(){
      File pastaDestino = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/");
      File arquivoOrigem = new File("//data/data/sistema.escola/databases/Escola.db");
      File arquivoDestino = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/BACKUP_APP_ESCOLA/Escola_backup.db");

      try {
           if(!pastaDestino.exists()){
                pastaDestino.mkdir();
           }

           FileChannel input = new FileInputStream(arquivoOrigem).getChannel();
           FileChannel Output = new FileOutputStream(arquivoDestino).getChannel();

           Output.transferFrom(input, 0, input.size());

           input.close();
           Output.close();

           Toast.makeText(MainActivity.this, "EXPORTAÇÃO REALIZADA COM SUCESSO!", Toast.LENGTH_SHORT).show();
      }
      catch (IOException e) {
           e.printStackTrace();
           Toast.makeText(MainActivity.this, "EXPORTAÇÃO NÃO REALIZADA!", Toast.LENGTH_SHORT).show();
      }
 }

Um DETALHE MAIS DO QUE FUNDAMENTAL é colocar as permissões no Manifest:

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

(E não colocar as permissões, ele nem cria a pasta! (E eu quebrando a cabeça com o mkdir :unamused:)

Orochimaru, mt obrigada pela atenção! Fica com Deus!
Espero que esse tópico ajude mais pessoas