Abra cualquier SQLiteDatabase como su / root

Sé, puedo iniciar un proceso como usuario root, pero ¿cómo puedo crear una SQliteDatabase con una ruta de acceso dada (cualquier camino, es decir, la base de datos de otra aplicación)? Como usuario root en este proceso de raíz …

He intentado leer el archivo directamente, pero incluso esto no funciona (pide CADA VEZ para el acceso de root de nuevo) y sólo imprime un resultado vacío (porque sqlite3 no se encuentra)

String path = "/data/data/<app_package>/databases/<database_name>"; Process p = Runtime.getRuntime().exec("su sqlite3 -csv " + path + " \"select * from test\";"); StringBuilder res = new StringBuilder(); String line; while ((line = bufferedReader.readLine()) != null) res.append(line + "\n"); 

En realidad, quiero leer el contenido de la base de datos de otra aplicación, ¿cómo puedo hacerlo correctamente? Me conformaría con una de las dos soluciones siguientes:

  • Obtener el contenido de una consulta como csv o cualquier cosa similar

  • SQLiteDatabase un objeto SQLiteDatabase como root, con una ruta de acceso de base de datos dada (preferido, ya que es mucho más flexible)

SOLUCIÓN PARCIAL ENCONTRADA:

Ver mi respuesta …

PERO: sigue siendo un problema, pide permisos de SU CADA VEZ, ¿cómo puedo evitar esto?

Siguiendo los trabajos hasta ahora, sólo con un problema: pide permisos cada vez … Probablemente debido al nuevo proceso …

 try { String dbName = "<database_name>"; String packageSrc = "<package_source>"; String pathSource = "/data/data/" + packageSrc + "/databases/" + dbName; String pathTarget = "/data/data/" + MainApp.getAppContext().getPackageName() + "/databases/" + dbName; // 1) delete old copied file // 2) copy file // 3/4) set permissions of copied file String commandDelete = "rm " + pathTarget + "\n"; String commandCopy = "cat " + pathSource + " > " + pathTarget + "\n"; String commandCHOwn = "chown root.root " + pathTarget + "\n"; String commandCHMod = "chmod 777 " + pathTarget + "\n"; Process p = Runtime.getRuntime().exec("su"); OutputStream os = p.getOutputStream(); os.write((commandDelete).getBytes("ASCII")); os.flush(); os.write((commandCopy).getBytes("ASCII")); os.flush(); os.write((commandCHOwn).getBytes("ASCII")); os.flush(); os.write((commandCHMod).getBytes("ASCII")); os.flush(); os.close(); try { p.waitFor(); if (p.exitValue() != 255) { SQLiteDatabase db = SQLiteDatabase.openDatabase(pathTarget, null, SQLiteDatabase.OPEN_READONLY); // be happy and work with the database } } catch (InterruptedException e) { // error } } catch (IOException e) { // error } 

Primero copie el archivo de la base de datos en la carpeta "assets" de su proyecto y después haga un archivo de base de datos para conectarse con Database (base de datos sqlite)

Public class dbdata extends SQLiteOpenHelper {

 private static String DBName = "dbdata"; private String DBVersion = "3"; private static Context context; private static String DB_PATH = ""; private SQLiteDatabase myDataBase; Context myContext; public dbdata(Context context) { super(context, DBName, null, 1); myContext = context; DB_PATH = "/data/data/" + context.getPackageName() + "/databases/"; try { createDataBase(); } catch (IOException e) { e.printStackTrace(); } } public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (dbExist) { // do nothing - database already exist } else { this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); } } } private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { String myPath = DB_PATH + DBName; checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { // database does't exist yet. } if (checkDB != null) { checkDB.close(); } return checkDB != null ? true : false; } private void copyDataBase() throws IOException { // Open your local db as the input stream InputStream myInput = myContext.getAssets().open(DBName); // Path to the just created empty db String outFileName = DB_PATH + DBName; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } // Close the streams myOutput.flush(); myOutput.close(); myInput.close(); } public void openDataBase() throws SQLException { String myPath = DB_PATH + DBName; myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY); } @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-gene rated method stub } 

Hacer su propia función como esta

// Añadir una nueva tabla de relación de contacto

 public void addContact(personprp prop) { SQLiteDatabase db = this.getWritableDatabase(); ContentValues values = new ContentValues(); values.put("rl_first_name", prop.firstname); values.put("rl_last_name", prop.lastname); values.put("rl_age", prop.age); values.put("rl_dob", prop.dob); values.put("rl_address", prop.address); values.put("rl_category", prop.category); values.put("rl_firstcall", prop.firstcall); values.put("rl_firstmsg", prop.firstmsg); values.put("rl_brother", prop.brothers); values.put("rl_sister", prop.sisters); values.put("rl_mobile", prop.mobileno); values.put("rl_emailid", prop.emailid); values.put("rl_facebookid", prop.facebookid); values.put("rl_imagepath", prop.imagepath); db.insert("tb_contact", null, values); System.out.println("datasaved"); // Inserting Row db.close(); // Closing database connection } 

}

  • Cómo encontrar y borrar el archivo db de SQLite en Android (emulador)
  • Sqlite excepción en crear sentencia de tabla
  • Excepción "tabla ... no tiene columna nombrada ..."
  • Android: insertar varias filas en la base de datos sqlite no funciona
  • Copia de seguridad de Android y restauración de la base de datos desde y hacia la tarjeta SD
  • Leer datos de sqlite cuando se está ejecutando una transacción (Android)
  • Android: cómo consultar SQLiteDatabase con args de selección de no-cadena?
  • Cómo consultar una tabla FTS4 de contenido externo pero devolver columnas adicionales de la tabla de contenido original
  • Android SQLiteOpenHelper - clase diferente para cada tabla?
  • GreenDAO crea una propiedad de ID automática
  • Intenta invocar el método virtual 'java.lang.Class java.lang.reflect.Field.getType ()' en una referencia de objeto nulo
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.