Como escrever um database para um arquivo de texto no android

Eu estou trabalhando em um aplicativo de espionagem para o meu projeto de faculdade. Para isso eu registrei as chamadas, localização e SMS do dispositivo e armazená-los em um database. Agora eu quero exportar o conteúdo do database para um arquivo de texto .. Eu tentei o código abaixo.

private void readAndWriteCallsData() { File dataBaseFile = getDatabasePath("DATABASE"); File callDataFile = new File(Environment.getDataDirectory()+"/data/com.example.myapp/databases/"+"DATABASE"); try { BufferedReader dbFileReader = new BufferedReader(new FileReader(callDataFile)); String eachLine; while((eachLine = dbFileReader.readLine()) != null) { Callslog.append(eachLine); Callslog.append("\n"); } } catch (IOException e) { e.printStackTrace(); } } 

Mas isso não está funcionando … Por favor me ajude …

Você pode codificar o arquivo de database de stream binário para stream de caracteres por Base64 e, em seguida, decodificar o texto quando encontrarary.

Primeiro, encontre uma biblioteca Base64. Você pode usar http://sourceforge.net/projects/iharder/files/base64/ . Existe apenas um arquivo, “Base64.java”.

Exemplo de código:

 private void readAndWriteCallsData() { File callDataFile = new File(Environment.getDataDirectory()+"/data/com.example.myapp/databases/"+"DATABASE"); try { FileInputStream fis = new FileInputStream(callDataFile); try{ byte[] buf = new byte[512]; int len; while((len = fis.read(buf)) > 0){ String text = Base64.encodeBytes(buf, 0, len); // encode binary to text Callslog.append(text); Callslog.append("\n"); } }finally{ fis.close(); } } catch (IOException e) { e.printStackTrace(); } } 

Para reverter, codifique como segue:

 private void revertCallsData() { File encodedCallDataFile; // get reference to the encoded text file try { BufferedReader br = new BufferedReader(new FileReader(encodedCallDataFile)); try{ String line; while((line = br.readLine()) != null){ byte[] bin = Base64.decode(line); // decode each line to binary, you can get the original database file } }finally{ br.close(); } } catch (IOException e) { e.printStackTrace(); } } 

ok pessoal depois de muito sucesso e julgamento eu finalmente encontrei a solução, aqui está o código, salvei a funcionalidade em um botão.

 final String SAMPLE_DB_NAME = "MyDBName.db";//database name save.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub File sd = Environment.getExternalStorageDirectory(); File data = Environment.getDataDirectory(); FileChannel source=null; FileChannel destination=null; String currentDBPath = "/data/"+ "your package name" +"/databases/"+SAMPLE_DB_NAME; String backupDBPath = SAMPLE_DB_NAME; File currentDB = new File(data, currentDBPath); File backupDB = new File(sd, backupDBPath); try { source = new FileInputStream(currentDB).getChannel(); destination = new FileOutputStream(backupDB).getChannel(); destination.transferFrom(source, 0, source.size()); source.close(); destination.close(); Toast.makeText(getApplicationContext(),"Your database has been exported", Toast.LENGTH_LONG).show(); } catch(IOException e) { e.printStackTrace(); } } }); 

o database será salvo em / storage / emulated / 0 /

Eu recomendaria exportar para um formato de arquivo estruturado, como JSON ou CSV. Aqui está o meu método exportador JSON. Talvez isso ajude

 private static final String LOG_FOLDER = "/ExportFolder"; private static final String FILE_NAME = "export_file.json"; public static void exportMeasurementsJSON(Handler mHandler) { sendToastMessage("Export to JSON started", mHandler); File folder = new File(Environment.getExternalStorageDirectory() + LOG_FOLDER); if (!folder.exists()) folder.mkdir(); final String filename = folder.toString() + "/" + getLogFileName(".json"); try { FileWriter fw = new FileWriter(filename, false /* append */); // get the db SomeDateSource db = PIApplication.getDB(); // Google Gson for serializing Java Objects into JSON Gson mGson = new GsonBuilder().create(); Cursor c = db.getAllRows(); if (c != null) { while (c.moveToNext()) { fw.append(mGson.toJson(new DBEntry(c .getString(1), c.getString(2), c .getDouble(3), c.getLong(4)))); fw.append('\n'); } c.close(); } fw.close(); sendToastMessage("Export finished", mHandler); } catch (Exception e) { sendToastMessage("Something went wrong", mHandler); e.printStackTrace(); } } 

Se você estiver interessado, também posso adicionar meu exportador de CSV.

Sua pergunta não está clara (você está tentando copiar o arquivo para um local alternativo ou exportar os dados reais dele?)

Se você deseja copiar apenas o arquivo, copie o arquivo db usando o seguinte método:

 public static void copyFile(String sourceFileFullPath, String destFileFullPath) throws IOException { String copyFileCommand = "dd if=" + sourceFileFullPath + " of=" + destFileFullPath; Runtime.getRuntime().exec(copyFileCommand); } 

Simplesmente chame esse método com o caminho do arquivo de database ( /data/data/package_name/databases/database_name ) como sourceFileFullPath e o caminho do arquivo de destino como destFileFullPath . Você pode usar ferramentas como o SQLite Expert para visualizar o conteúdo do database no seu PC / Laptop.

Se a sua intenção é exportar os dados do database e armazená-los em um arquivo de texto (um arquivo CSV ou algo similar), você não deve ler o conteúdo do arquivo de database e usar a class SQLiteDatabase para query o conteúdo de cada tabela. Cursor e iterar para gravar cada linha do cursor em um arquivo de texto.

Você pode exportar o database inteiro para a pasta sdcard e usar o gerenciador do SQLite para abrir e ver seu conteúdo.

Um exemplo está disponível aqui: http://www.techrepublic.com/blog/software-engineer/export-sqlite-data-from-your-android-device/

Aqui está o método completo para escrever o database no cartão SD:

 /** * Copy the app db file into the sd card */ private void backupDatabase(Context context) throws IOException { //Open your local db as the input stream String inFileName = "/data/data/yourappPackageName/databases/yourDBName.db"; // OR use- context.getFilesDir().getPath()+"/databases/yourDBName.db";// File dbFile = new File(inFileName); FileInputStream fis = new FileInputStream(dbFile); String outFileName = Environment.getExternalStorageDirectory()+"/"+SQLiteDataHelper.DB_NAME; //Open the empty db as the output stream OutputStream output = new FileOutputStream(outFileName); //transfer bytes from the inputfile to the outputfile byte[] buffer = new byte[1024]; int length; while ((length = fis.read(buffer))>0){ output.write(buffer, 0, length); } //Close the streams output.flush(); output.close(); fis.close(); } 

Espero que isso ajude você.

Uma maneira de fazer isso (eu suponho que é um procedimento longo, embora fácil), se você conhece o database e obtém todas as tabelas e recupera as informações dessas tabelas. Já que estamos falando de bancos de dados sqlite, suponho que seja pequeno.

 SELECT * FROM dbname.sqlite_master WHERE type='table';