Cómo escribir una base de datos en un archivo de texto en android

Estoy trabajando en una aplicación de espionaje para el propósito de mi proyecto universitario. Para eso he registrado las llamadas, la localización y los SMS del dispositivo y los he almacenado en una base de datos. Ahora quiero exportar el contenido de la base de datos a un archivo de texto. Intenté el código abajo.

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

Pero eso no funciona … Por favor, ayúdame …

Puede codificar el archivo de base de datos de flujo binario a flujo de caracteres por Base64, a continuación, decodificar el texto cuando nessesary.

En primer lugar, busque una biblioteca de Base64. Puede utilizar http://sourceforge.net/projects/iharder/files/base64/ . Sólo hay un archivo, "Base64.java".

Ejemplo 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 revertirlo, el código como sigue:

 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 chicos después de un montón de éxito y juicio finalmente encontré la solución, aquí está el código, he guardado la funcionalidad en un botón.

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

La base de datos se guardará en / storage / emulated / 0 /

Yo recomendaría exportar a un formato de archivo estructurado como JSON o CSV. Aquí está mi método JSON exportador. Tal vez ayude

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

Si usted está interesado también puedo agregar mi exportador CSV.

Su pregunta no es tan clara (¿Está intentando copiar el archivo en una ubicación alternativa o exportar los datos reales de la misma?)

Si sólo desea copiar el archivo, puede copiar el archivo db mediante el siguiente método:

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

Simplemente llame a ese método con la ruta del archivo de base de datos ( /data/data/package_name/databases/database_name ) como sourceFileFullPath y su ruta de destino como destFileFullPath . Puede utilizar herramientas como SQLite Expert para ver el contenido de la base de datos en su PC / Laptop.

Si su intención es exportar los datos de la base de datos y almacenarlos en un archivo de texto (un archivo CSV o algo similar), entonces no debería leer el contenido del archivo de base de datos y utilizar la clase SQLiteDatabase para query cada contenido de la tabla en un archivo Cursor e iterar para escribir cada fila del cursor en un archivo de texto.

Usted podría exportar el DB entero en su carpeta del sdcard y después utilizar el encargado de SQLite para abrir y ver su contenido.

Un ejemplo está disponible aquí: http://www.techrepublic.com/blog/software-engineer/export-sqlite-data-from-your-android-device/

Aquí está el método completo para escribir la base de datos en la tarjeta 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 te ayude.

Una forma de hacerlo (supongo que es un procedimiento largo, fácil aunque), si conoce la base de datos y obtener todas las tablas y recuperar información de esas tablas. Dado que, estamos hablando de sqlite DBs, supongo que será pequeño.

 SELECT * FROM dbname.sqlite_master WHERE type='table'; 
  • SQLite3 FTS4, MATCH y Android
  • Razones para utilizar la base de datos SQLite legible
  • Alterar el campo único de la tabla
  • Android - Código de error 11 al importar la base de datos Sqlite en Galaxy Note
  • SQLiteDatabase.insert () devuelve rowid incorrecto para tablas virtuales
  • Cómo ver la base de datos de aplicación de Android que se ejecuta en mi teléfono
  • Error de "Error al abrir la base de datos" al copiar una base de datos sqlite de activos En Android 4.2
  • La base de datos SQLite de Android está bloqueada
  • java.lang.NullPointerException error en una consulta
  • Android columna '_id' no existe?
  • Android SQLite ON CONFLICT UPDATE es posible?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.