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

46 respostas
java
wlcs22

Boa noite.

Consegui fazer a Exportação do banco de dados de um app do Android Studio para a memória Externa do Celular, porém estou querendo fazer o inverso agora, ou seja, pegar esse arquivo que foi salvo na memória externa do celular e salvá-lo na memória do sistema do app, onde está o banco de dados SQLite.

Fiz a importação do arquivo usando a mesma lógica da exportação, só que invertendo os valores com o fim de resgatar esse arquivo que está NA memória externa do celular PARA A memória do sistema, onde está o banco de dados.

Para salvar o meu banco de dados NA memória externa do celular eu fiz:

File pastaOrigem = new File("//data/data/sistema.escola/databases/Escola.db");
File pastaDestino = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA");
File arquivoDestinoExterno = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");

try {
    pastaDestino.mkdir();
    FileChannel input = new FileInputStream(pastaOrigem).getChannel(); // FileInputStream é a leitura de fluxo de dados
    FileChannel Output = new FileOutputStream(arquivoDestinoExterno).getChannel(); // FileOutputStream é um fluxo de saída para gravar dados em um File

    Output.transferFrom(input, 0, input.size());
    input.close();
    Output.close();
}
catch (IOException e) {
    e.printStackTrace();
}

Agora desejo fazer o inverso, pegar ele DA memória externa para colocá-lo NO sistema (tipo, se o app foir desinstalado, ao instalá-lo novamente, importaria o arquivo que foi exportado, para recuperar os dados que foram salvos). Nesse caso fiz o código assim:

public String importacaoBanco() {
    String retorno = null;

    File pastaOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA");
    File arquivoDestinoSistema = new File(Environment.getDataDirectory()+"//data/data/sistema.escola/databases/Escola.db");

    try {
        FileChannel input = new FileInputStream(pastaOrigem).getChannel();
        FileChannel Output = new FileOutputStream(arquivoDestinoSistema).getChannel();

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

        return retorno = "UPLOAD REALIZADO COM SUCESSO!";
    }
    catch (IOException e) {
        e.printStackTrace();
        return retorno = "UPLOAD NÃO REALIZADO!";
    }
}

Mas está rodando o catch(), ou seja, ele não está importando o arquivo DA memória externa do celular PARA O sistema do app, onde está salvo o banco de dados. Na vdd o arquivo do sistema seria substituído por este que foi exportado/salvo na memória externa do celular.

Obg!

46 Respostas

rodriguesabner

qual erro dá?

wlcs22

Não dá erro, ele só roda o catch() msm. Fui no Log, também não ter erro, mas no run dá o segunte:

> Build Date                       : 12/27/18
> OpenGL ES Shader Compiler Version: EV031.25.03.02
> Local Branch                     : 
> Remote Branch                    : refs/tags/AU_LINUX_ANDROID_LA.UM.7.5.R1.09.00.00.464.037
> Remote Branch                    : NONE
> Reconstruct Branch               : NOTHING
> Build Config                     : S L 6.0.7 AArch32
> I/Adreno: PFP: 0x005ff110, ME: 0x005ff066
> I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
> android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
> I/OpenGLRenderer: Initialized EGL, version 1.4
> D/OpenGLRenderer: Swap behavior 2
> W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@59d2653
> D/OpenGLRenderer: endAllActiveAnimators on 0x8aeb3100 (RippleDrawable) with handle 0x8aed2930
> W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@f47a498
> W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@db8575c
> W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@ced9103
> W/System.err: java.io.FileNotFoundException: /storage/emulated/0/BACKUP_APP_ESCOLA (Is a directory)
> W/System.err:     at java.io.FileInputStream.open0(Native Method)
> W/System.err:     at java.io.FileInputStream.open(FileInputStream.java:231)
>     at java.io.FileInputStream.<init>(FileInputStream.java:165)
>     at sistema.escola.BancoDeDados.importacaoBanco(BancoDeDados.java:253)
>     at sistema.escola.UploadDoBanco$1.onClick(UploadDoBanco.java:36)
>     at android.view.View.performClick(View.java:6600)
>     at android.view.View.performClickInternal(View.java:6577)
>     at android.view.View.access$3100(View.java:781)
> W/System.err:     at android.view.View$PerformClick.run(View.java:25912)
>     at android.os.Handler.handleCallback(Handler.java:873)
>     at android.os.Handler.dispatchMessage(Handler.java:99)
>     at android.os.Looper.loop(Looper.java:193)
>     at android.app.ActivityThread.main(ActivityThread.java:6923)
>     at java.lang.reflect.Method.invoke(Native Method)
>     at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
> W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:870)

Ele disse que é uma pasta em:

/storage/emulated/0/BACKUP_APP_ESCOLA (Is a directory)

Daí fiz assim:

public String importacaoBanco() {
    String retorno = null;

    File arquivoDeOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");
    File arquivoDestinoSistema = new File(Environment.getDataDirectory()+"//data/data/sistema.escola/databases/Escola.db");

    try {
        FileChannel input = new FileInputStream(arquivoDeOrigem).getChannel();
        FileChannel Output = new FileOutputStream(arquivoDestinoSistema).getChannel();

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

        return retorno = "UPLOAD REALIZADO COM SUCESSO!";
    }
    catch (IOException e) {
        e.printStackTrace();
        return retorno = "UPLOAD NÃO REALIZADO!";
    }
}

alterei a pastaOrigem para arquivoDeOrigem:

File arquivoDeOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");

Continua rodando o catch(), mas dessa vez o input rodou e parou no output. Segue o Run:

Accessing hidden field Landroid/graphics/Insets;->left:I (light greylist, linking)
    Accessing hidden field Landroid/graphics/Insets;->right:I (light greylist, linking)
    Accessing hidden field Landroid/graphics/Insets;->top:I (light greylist, linking)
    Accessing hidden field Landroid/graphics/Insets;->bottom:I (light greylist, linking)
W/sistema.escola: Accessing hidden method Landroid/view/View;->computeFitSystemWindows(Landroid/graphics/Rect;Landroid/graphics/Rect;)Z (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/view/ViewGroup;->makeOptionalFitsSystemWindows()V (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/widget/TextView;->getTextDirectionHeuristic()Landroid/text/TextDirectionHeuristic; (light greylist, linking)
W/sistema.escola: Accessing hidden method Landroid/graphics/FontFamily;-><init>()V (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/graphics/FontFamily;->addFontFromAssetManager(Landroid/content/res/AssetManager;Ljava/lang/String;IZIII[Landroid/graphics/fonts/FontVariationAxis;)Z (light greylist, reflection)
    Accessing hidden method Landroid/graphics/FontFamily;->addFontFromBuffer(Ljava/nio/ByteBuffer;I[Landroid/graphics/fonts/FontVariationAxis;II)Z (light greylist, reflection)
    Accessing hidden method Landroid/graphics/FontFamily;->freeze()Z (light greylist, reflection)
    Accessing hidden method Landroid/graphics/FontFamily;->abortCreation()V (light greylist, reflection)
W/sistema.escola: Accessing hidden method Landroid/graphics/Typeface;->createFromFamiliesWithDefault([Landroid/graphics/FontFamily;Ljava/lang/String;II)Landroid/graphics/Typeface; (light greylist, reflection)
D/OpenGLRenderer: Skia GL Pipeline
I/Adreno: QUALCOMM build                   : 7adeec4758, I21281c58c8
    Build Date                       : 12/27/18
    OpenGL ES Shader Compiler Version: EV031.25.03.02
    Local Branch                     : 
    Remote Branch                    : refs/tags/AU_LINUX_ANDROID_LA.UM.7.5.R1.09.00.00.464.037
    Remote Branch                    : NONE
    Reconstruct Branch               : NOTHING
    Build Config                     : S L 6.0.7 AArch32
I/Adreno: PFP: 0x005ff110, ME: 0x005ff066
I/ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasWideColorDisplay retrieved: 0
    android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
I/OpenGLRenderer: Initialized EGL, version 1.4
D/OpenGLRenderer: Swap behavior 2
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@59d2653
W/ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@33a2212
W/System.err: java.io.FileNotFoundException: /data/data/data/sistema.escola/databases/Escola.db (No such file or directory)
W/System.err:     at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(FileOutputStream.java:308)
W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:238)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:180)
        at sistema.escola.BancoDeDados.importacaoBanco(BancoDeDados.java:254)
        at sistema.escola.UploadDoBanco$1.onClick(UploadDoBanco.java:36)
W/System.err:     at android.view.View.performClick(View.java:6600)
        at android.view.View.performClickInternal(View.java:6577)
        at android.view.View.access$3100(View.java:781)
W/System.err:     at android.view.View$PerformClick.run(View.java:25912)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err:     at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6923)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
W/System.err:     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:870)

Tem dizendo assim:

W/System.err: java.io.FileNotFoundException: /data/data/data/sistema.escola/databases/Escola.db (No such file or directory)
W/System.err:     at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(FileOutputStream.java:308)
W/System.err:     at java.io.FileOutputStream.<init>(FileOutputStream.java:238)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:180)
        at sistema.escola.BancoDeDados.importacaoBanco(BancoDeDados.java:254)
        at sistema.escola.UploadDoBanco$1.onClick(UploadDoBanco.java:36)

(No such file or directory)

Mas o arquivo foi exportado e está na memória externa do celular, com os valores corretos.

rodriguesabner

é isso msm, vc ta querendo copiar a pasta, copia o arquivo:

File pastaOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/nomedoarquivo.extensao");
wlcs22

Então…

Fiz:

File arquivoDeOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");

Ele diz:

W/System.err: java.io.FileNotFoundException: /data/data/data/sistema.escola/databases/Escola.db (No such file or directory)

Mas, tipo, a pasta

"//data/data/sistema.escola/databases/Escola.db"

existe! É nela que o banco de dados do app está salvo. Por isso até comentei que acho que ele será substituído pelo backup, daí terei o conteúdo que foi salvo.

rodriguesabner
File arquivoDeOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");

Arquivo de backup é o nome do seu arquivo? como vc ta escrevendo de fato? O erro ta falando uma coisa e o código outra.

vc quer copiar a pasta ou o arquivo?

wlcs22

BACKUP_APP_ESCOLA é o nome da PASTA, ARQUIVO_DE_BACKUP o nome do ARQUIVO que foi copiado para a memória externa do celular. É ele, ARQUIVO_DE_BACKUP, que quero salvar na pasta do sistema do app.

rodriguesabner

olha, pensa comigo:

nome da pasta:

nome do arquivo:

Erro:

o nome da pasta é:

sistema.escola/databases/

nome do arquivo é:

Escola.db

Entendeu?

rodriguesabner

Ata, entendi agora…

File arquivoDeOrigem = new File(Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP");

faz o q fizemos ontem:

File arquivoDestino.....
if(!arquivoDestino.exists()){
    arquivoDestino.mkdir();
}
wlcs22

Então,

BACKUP_APP_ESCOLA é o nome da PASTA e ARQUIVO_DE_BACKUP o nome do ARQUIVO (DA MEMÓRIA EXTERNA) eu tô querendo passar ele pra o sistema que é sistema.escola/databases/Escola.db (pasta e arquivo juntos)

wlcs22

orochimaru, a pasta do sistema já existe, ela é do sistema, não foi apagada em nenhum momento. Eu só copiei o arquivo que tinha nela para a memória externa do celular, só.

Fiz oq vc falou e continua na msm:

W/System.err: java.io.FileNotFoundException: /data/data/data/sistema.escola/databases/Escola.db (No such file or directory)

Será que com o getFileDir() resolveria? Como seria seu uso?

rodriguesabner

testei metodo aqui e funcionou:

private void copiarArquivo() {
    String arquivo_origem = Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP";
    String arquivo_final = Environment.getDataDirectory() + "//data/data/sistema.escola/databases/Escola.db";
    //arquivo de origem n tem extensao e o arquivo final tem (?????)
    
    InputStream in = null;
    OutputStream out = null;
    try {
        File dir = new File(arquivo_final);
        if (!dir.exists()) {
            dir.mkdirs();
        }

        in = new FileInputStream(arquivo_origem);
        out = new FileOutputStream(arquivo_final);

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

        out.flush();
        out.close();
        out = null;

    } catch (FileNotFoundException e) {
        Log.e("tag", e.getMessage());
    } catch (Exception e) {
        Log.e("tag", e.getMessage());
    }

}
wlcs22

Não rodou e deu esse erro:

E/tag: /data/data/data/sistema.escola/databases/Escola.db (No such file or directory)

rodriguesabner

lista as pastas por favor:

private void listarPastas() {
        String path = Environment.getDataDirectory() + "//data/data/";
        Log.d("Files", "Path: " + path);
        File directory = new File(path);
        File[] files = directory.listFiles();
        Log.d("Files", "Size: " + files.length);
        for (int i = 0; i < files.length; i++) {
            Log.d("Files", "FileName:" + files[i].getName());
        }
    }
wlcs22

Só troquei o private pelo public pq, como a exportação, a importação tbm está sendo chamada no button de outra classe, mas o erro é na classe em que o código está sendo implementado.

Simplesmente fecha a aplicação. Mas continua execultando o app no run.

rodriguesabner

Eu tenho ctz q sua pasta nao existe…

Tenta assim pra vc ver:

public void listarPastas() {
    String path = Environment.getExternalStorageDirectory().toString() + "//data/data";
    File directory = new File(path);
    if (!directory.exists()) {
        System.out.println("pasta n existe");
        if(directory.mkdir()){
            System.out.println("criei a pasta");
        }
    }

    System.out.println(directory.getAbsolutePath());
    File[] files = directory.listFiles();
    for (int i = 0; i < files.length; i++) {
        System.out.println(files[i].getName());
    }
}

wlcs22

A pasta que me refiro é esta:

Ela sempre existe no sistema do app. É nela que é guardado o Banco de dados (SQLite) Escola.db , foi dela que eu exportei o arquivo, ela não foi excluída.

No run tem o seguinte:

Mas tipo a pasta que vc criou foi a /data/data , ela não se encontra no Device File Explorer.

rodriguesabner
private void listarPastas() {
    String minha_pasta = getApplicationInfo().dataDir + "/databases/";
    File file = new File(minha_pasta);
    System.out.println("PASTA DO APP:::" + minha_pasta );
    System.out.println(file.getAbsolutePath());
    File[] files = file.listFiles();
    for (int i = 0; i < files.length; i++) {
        System.out.println(files[i].getName());
    }
}

AGORA VAI, SE NAO FOR VC JOGA O PC FORA

wlcs22

kkkkkk…

De onde vc tirou o getApplicationInfo() ?

image

rodriguesabner

esqueci q vc n ta usando isso na activity, faz assim:

private void listarPastas(Context context) {
    String minha_pasta = context.getApplicationInfo().dataDir + "/databases/";
....
}

aí pra chamar vc faz:

listarPastas(this);
wlcs22

Fiz.

Olha o print:

Mas nesse caso, vc só pegou a referência das pastas até os arquivos que tem nelas, certo?

Como te disse, elas já existe, tanto é que vc as localizou. A questão é a transferência do arquivo pra elas. Provavelmente ele vai substituir o Escola.db que já está lá (Foi ele que eu exportei pra memória externa do celular). Entendi errado?

Vc agora me fez pensar numa coisa, o arquivo a ser recuperado é ARQUIVO_DE_BACKUP, então ele vai pro sistema com esse nome msm, pra ser substituído, ele teria que ter o msm nome, no caso, Escola.db

rodriguesabner

um passo de cada vez scooby doo, tenta agora:

private void copiarArquivo(Context context) {
    String arquivo_origem = Environment.getExternalStorageDirectory() + "/BACKUP_APP_ESCOLA/ARQUIVO_DE_BACKUP";
    String arquivo_final = context.getApplicationInfo().dataDir + "/databases/Escola.db";
    
    InputStream in = null;
    OutputStream out = null;
    try {
        File dir = new File(arquivo_final);

        in = new FileInputStream(arquivo_origem);
        out = new FileOutputStream(arquivo_final);

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

        out.flush();
        out.close();
        out = null;

    } catch (FileNotFoundException e) {
        Log.e("tag", e.getMessage());
    } catch (Exception e) {
        Log.e("tag", e.getMessage());
    }

}
rodriguesabner

só salvar como Escola.db, mas tanto faz, vc pode mudar o nome do arquivo na hora de salvar!

String arquivo_origem = Environment.getExternalStorageDirectory() + "/Pictures/1586118430294.jpg";
String arquivo_final = context.getApplicationInfo().dataDir + "/databases/Escola.db";

Eu peguei uma img e salve como .db


image

wlcs22

Rodou o try, (mas pq o arquivo ARQUIVO_DE_BACKUP não está lá nas pastas do Device File Explorer?) CERTO!

A questão é que quando vou abrir o app, os dados não estão lá. Os alunos cadastrados não estão na lista.

rodriguesabner

ele ta sim,

image

aqui no meu deu permission denied, mas é só abrir o android como administrador.

O caminho dele é esse:

I/System.out: PASTA DO APP:::/storage/emulated/0
rodriguesabner

pergunta besta, mas vc cadastrou alguem antes de trocar de .db?

wlcs22

9 alunos!

orochimaru, a referência tá pra pasta do celular! Olha o print:

São as pastas do meu celular, ou entendi isso errado? kkk meu Deus…

rodriguesabner

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

O problema inicial desse tópico foi resolvido?

rodriguesabner

é isso mesmo, vc quer trocar a pasta?

wlcs22

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

rodriguesabner

é o que estamos fazendo:

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

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?

rodriguesabner

faz isso

wlcs22

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

rodriguesabner

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

wlcs22

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

rodriguesabner

ok

wlcs22

Ok, obg! Até amanhã.

wlcs22

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.

rodriguesabner

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

wlcs22

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?

rodriguesabner

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

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?

rodriguesabner

lê os arquivos daqui:

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

ve o que vai retornar

wlcs22

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…

rodriguesabner

vou te mandar um dm.

wlcs22

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

Criado 12 de abril de 2020
Ultima resposta 19 de abr. de 2020
Respostas 46
Participantes 2