2013-03-17 18 views
6

Ich arbeite an einer Spionage-Anwendung für meine College-Projekt Zweck. Dafür habe ich die Anrufe, den Standort und die SMS des Gerätes protokolliert und in einer Datenbank gespeichert. Jetzt möchte ich den Inhalt der Datenbank in eine Textdatei exportieren. Ich habe den folgenden Code ausprobiert.Wie schreibe ich eine Datenbank in eine Textdatei 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(); 
    } 


} 

Aber das nicht funktioniert ... Bitte helfen Sie mir ...

+0

Ihr Code hat keine Writers (Alle Leser) !! Bitte erklären Sie, was nicht funktioniert? –

+0

Eigentlich können Sie das tun ... Aber Sie erhalten nur Binärdaten in Textdatei. Vielleicht können Sie einfach Ihre db-Datei nehmen, benennen Sie es in das richtige Textformat und Sie bekommen, was Sie brauchen. –

+0

@AlekseyMaximus CODE BITTE –

Antwort

2

Sie können die Datenbankdatei von binären Stream Zeichenstrom durch Base64 kodieren, dann den Text entschlüsseln, wenn nessesary.

Suchen Sie zuerst eine Base64-Bibliothek. Sie können http://sourceforge.net/projects/iharder/files/base64/ verwenden. Es gibt nur eine Datei, "Base64.java".

Code-Beispiel:

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

es zurückkehren möchten, Code wie folgt vor:

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

Ich bin ein Starter in Android. Können Sie das bitte mit dem Code erklären? Der Name der Datenbankdatei lautet "DATENBANK". Jetzt, wie man diese Daten in eine Textdatei schreibt. ** CODE BITTE ** Danke :) –

+0

Ich habe versucht, die Codierung Teil, aber immer noch Fehler ... 'E/AndroidRuntime (16078): java.lang.RuntimeException: Service kann com.innolabs.spydroid.WriteFromDataBase nicht gestartet werden @ 405464a0 mit Absicht {flg = 0x4 cmp = com.innolabs.spydroid/.WriteFromDataBase (hat Extras)}: java.lang.NullPointerException com.innolabs.spydroid.WriteFromDataBase.readAndWriteDataseFiles (WriteFromDataBase.java:81) E/AndroidRuntime (16078): \t bei com.innolabs.spydroid.WriteFromDataBase.onStartCommand (WriteFromDataBase.java:29) 'Ich erhalte einen Fehler bei CallsLog.append (Text); –

+0

Fügen Sie die readAndWriteDataseFiles-Methode ein, da sie falsch sein muss. – John

-1

Eine Möglichkeit, dies zu tun (ich nehme an es ist eine lange Prozedur, leicht though), wenn Sie wissen, die Datenbank und alle Tabellen abrufen und Informationen aus diesen Tabellen abrufen. Da wir über SQLite-DBs sprechen, nehme ich an, dass es klein sein wird.

2

ok jungs nach einer menge hit und probe habe ich endlich die lösung gefunden, hier ist der code, ich habe die funktion in einer taste gespeichert.

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


      } 


     }); 

die Datenbank in/storage/emulierten/0/

+0

dies ist kein Db-Dump, es ist mehr wie das Kopieren der Db-Datei, Sie brauchen noch SQLite-Anwendung, um diese Datei zu öffnen, oder? – Yazan

+0

Ja, Sie brauchen eine SQL-Lite-Anwendung – Hasan

1

Ihre Frage werden Sie versuchen die Datei an einen anderen Speicherort oder exportieren Sie die aktuellen Daten zu kopieren, nicht so klar gespeichert werden (ARE ? von ihm)

Wenn Sie nur die Datei kopieren mögen, können Sie die Datenbankdatei mit folgenden Methode kopieren:

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

Rufen Sie diese Methode einfach mit Ihrem Datenbankdateipfad (/data/data/package_name/databases/database_name) als sourceFileFullPath und Ihrem Zieldateipfad als destFileFullPath auf. Sie können dann Tools wie SQLite Expert verwenden, um den Inhalt der Datenbank auf Ihrem PC/Laptop anzuzeigen.

Wenn Ihre Absicht, die Daten aus der Datenbank exportieren und speichern sie in einer Textdatei (CSV-Datei oder ähnliches), dann sollten Sie die Datenbankdatei Inhalt nicht lesen, und verwenden Sie stattdessen die SQLiteDatabase Klasse query jede Tabelle Inhalt in eine Cursor und iterieren Sie es, um jede Cursorzeile in eine Textdatei zu schreiben.

0

Dies ist die komplette Methode für die Datenbank in der SD-Karte zu schreiben:

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

Hoffe, es wird Ihnen helfen.

2

ich in ein Structered Dateiformat zu exportieren wie JSON oder CSV empfehlen würde. Hier ist meine JSON-Exportmethode. Vielleicht hilft es

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

Wenn Sie interessiert sind, kann ich auch meine CSV-Exporteur hinzufügen.

Verwandte Themen