2013-01-24 17 views
5

sto cercando di prendere i dati dal mio database sqlite e scriverlo in un file csv e spedire via email le informazioni quando ho finito di scrivere. Ho solo una tabella con 3 colonne nel database. Ho DBAdapter e una classe che hanno il pulsante che l'utente deve premere per poter esportare i dati.esportazione sqlite in csv

Ecco il codice ho provato Exportdata.java

try { 
    root = Environment.getExternalStorageDirectory();     
    Log.i(TAG,"path.." +root.getAbsolutePath()); 

    //check sdcard permission 
    if (root.canWrite()) { 
     File fileDir = new File(root.getAbsolutePath()+"/fun/"); 
     fileDir.mkdirs(); 

     // Log.d("DATABASE", db.getAllBYname()); 

     File file= new File(fileDir, "itisfun.csv"); 
     FileWriter filewriter = new FileWriter(file); 
     BufferedWriter out = new BufferedWriter(filewriter); 
     out.write("I m enjoying......dude..............." ); 
     out.close(); 
    } 
} catch (IOException e) { 
    Log.e("ERROR:---", "Could not write file to SDCard" + e.getMessage()); 
} 

Questo codice fa creare il file nella scheda SD, ma il problema è non posso fare questo per prendere i dati del database SQLite e scrivere nel file come mostrato sul code.im bloccato per favore aiutami con esempio o modifica il mio codice con la soluzione giusta.

risposta

10

Io uso questa routine per eseguire il dump di un database SQLite in un file sulla scheda SD in formato CSV:

private Boolean backupDatabaseCSV(String outFileName) { 
    MyLog.d(TAG, "backupDatabaseCSV"); 
    Boolean returnCode = false; 
    int i = 0; 
    String csvHeader = ""; 
    String csvValues = ""; 
    for (i = 0; i < GC.CURCOND_COLUMN_NAMES.length; i++) { 
     if (csvHeader.length() > 0) { 
      csvHeader += ","; 
     } 
     csvHeader += "\"" + GC.CURCOND_COLUMN_NAMES[i] + "\""; 
    } 

    csvHeader += "\n"; 
    MyLog.d(TAG, "header=" + csvHeader); 
    dbAdapter.open(); 
    try { 
     File outFile = new File(outFileName); 
     FileWriter fileWriter = new FileWriter(outFile); 
     BufferedWriter out = new BufferedWriter(fileWriter); 
     Cursor cursor = dbAdapter.getAllRows(); 
     if (cursor != null) { 
      out.write(csvHeader); 
      while (cursor.moveToNext()) { 
       csvValues = Long.toString(cursor.getLong(0)) + ","; 
       csvValues += Double.toString(cursor.getDouble(1)) 
         + ","; 
       csvValues += Double.toString(cursor.getDouble(2)) 
         + ","; 
       csvValues += "\"" + cursor.getString(3) + "\","; 
       csvValues += Double.toString(cursor.getDouble(4)) 
         + ","; 
       csvValues += Double.toString(cursor.getDouble(5)) 
         + ","; 
       csvValues += "\"" + cursor.getString(6) + "\","; 
       csvValues += Double.toString(cursor.getDouble(7)) 
         + ","; 
       csvValues += Double.toString(cursor.getDouble(8)) 
         + ","; 
       csvValues += Double.toString(cursor.getDouble(9)) 
         + "\n"; 
       out.write(csvValues); 
      } 
      cursor.close(); 
     } 
     out.close(); 
     returnCode = true; 
    } catch (IOException e) { 
     returnCode = false; 
     MyLog.d(TAG, "IOException: " + e.getMessage()); 
    } 
    dbAdapter.close(); 
    return returnCode; 
} 

GC è la mia classe costanti globali che tra l'altro contiene i nomi delle colonne della tabella. I nomi delle colonne vengono utilizzati per creare la riga di intestazione nel file CSV. GetAllRows si trova nell'adattatore del database e restituisce tutte le righe nella tabella. Il while esegue il dump di tutte le righe che sono state restituite. I valori lunghi sono separati da virgola e i valori di testo sono quotati e separati da una virgola. MyLog.d esegue un Log.d in modalità test e non fa nulla quando è in modalità produzione. Il dbAdapter è definita al di fuori della funzione come variabile globale:

DatabaseAdapter dbAdapter = null; 

viene inizializzato in onCreate come:

dbAdapter = new DatabaseAdapter(getApplicationContext()); 

il dbAdapter è utilizzato in molteplici funzioni nell'attività. Se definisci globalmente la scheda Database, assicurati di associare ogni dbAdapter.open() a dbAdapter.close() ogni volta che lo usi. Inoltre, non dimenticare di chiudere ogni cursore che apri.

Nota: csvValues ​​è una concatenazione delle colonne restituite in ciascuna riga SQLite. Per ogni riga restituita nel cursore SQLite, csvValues ​​viene scritto come una riga nella tabella CSV.