2013-03-17 11 views
6

Sto lavorando a un'applicazione Spying per lo scopo del progetto del mio college. Per questo ho registrato le chiamate, la posizione e gli SMS del dispositivo e li ho memorizzati in un database. Ora voglio esportare il contenuto del database in un file di testo .. Ho provato il codice qui sotto.Come scrivere un database in un file di testo in Android

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


} 

Ma che non funziona ... Please help me ...

+0

Il tuo codice non ha scrittori (tutti i lettori) !! Per favore, spiega cosa non funziona? –

+0

In realtà puoi farlo ... Ma ottieni solo dati binari nel file di testo. Potresti semplicemente prendere il tuo file db, rinominarlo in un formato di testo corretto e otterrai ciò di cui hai bisogno. –

+0

@AlekseyMaximus CODICE PER FAVORE –

risposta

2

È possibile codificare il file di database da flusso binario a flusso di caratteri da Base64, poi decodificare il testo quando nessesary.

Prima trova una libreria Base64. È possibile utilizzare http://sourceforge.net/projects/iharder/files/base64/. C'è solo un file, "Base64.java".

Codice esempio:

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

Per ripristinare esso, il codice come 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(); 
    } 
} 
+0

Sono un antipasto in Android. Puoi per favore spiegarlo con il codice. Il nome del file del database è "DATABASE". Ora come scrivere quei dati in un file di testo. ** CODICE PER FAVORE ** Grazie :) –

+0

Ho provato la parte di codifica ma ho ancora ricevuto l'errore ... 'E/AndroidRuntime (16078): java.lang.RuntimeException: impossibile avviare il servizio com.innolabs.spydroid.WriteFromDataBase @ 405464a0 con Intent {flg = 0x4 cmp = com.innolabs.spydroid/.WriteFromDataBase (ha extra)}: java.lang.NullPointerException com.innolabs.spydroid.WriteFromDataBase.readAndWriteDataseFiles (WriteFromDataBase.java:81) E/AndroidRuntime (16078): \t su com.innolabs.spydroid.WriteFromDataBase.onStartCommand (WriteFromDataBase.java:29) 'Ricevo l'errore su CallsLog.append (testo); –

+0

Incollare il metodo readAndWriteDataseFiles, ci deve essere sbagliato con esso. – John

-1

Un modo per fare questo (presumo è una lunga procedura, facile però), se si sa il database e ottenere tutte le tabelle e recuperare informazioni da quelle tabelle. Dato che stiamo parlando di DB SQLite, presumo che sarà piccolo.

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

Ok ragazzi dopo un sacco di colpo e prova ho finalmente trovato la soluzione, ecco il codice, ho salvato la funzionalità in un pulsante.

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


      } 


     }); 

il database verrà salvato in/stoccaggio/emulato/0/

+0

questo non è un db-dump, è più come copiare il file db, hai ancora bisogno dell'applicazione sqlite per aprire quel file, giusto? – Yazan

+0

sì, hai bisogno di un'applicazione sql lite – Hasan

1

La tua domanda non è chiaro (Stai cercando di copiare il file in una posizione alternativa o esportare i dati effettivi ? da esso)

Se solo si desidera copiare il file, è possibile copiare il file db utilizzando il seguente metodo:

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

È sufficiente chiamare tale metodo con il percorso del file di database (/data/data/package_name/databases/database_name) come sourceFileFullPath e il percorso del file di destinazione come destFileFullPath. È possibile utilizzare strumenti come SQLite Expert per visualizzare il contenuto del database sul PC/laptop.

Se la vostra intenzione è quella di esportare i dati dal database e conservarla in un file di testo (un file CSV o qualcosa di simile), allora non si dovrebbe leggere il contenuto del file di database, e invece utilizzare la classe SQLiteDatabase a query ogni contenuto della tabella in un Cursor e iterarlo per scrivere ogni riga del cursore in un file di testo.

0

Ecco il metodo completo per la scrittura del database nella scheda 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(); 
    } 

Spero che vi aiuterà.

2

Suggerirei di esportare in un formato di file structered come JSON o CSV. Ecco il mio metodo di esportatore JSON. Forse aiuta

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 sei interessato posso anche aggiungere il mio esportatore CSV.