2012-07-25 12 views
16


He estado leyendo, hojeando, buscando mucho en esto, he cruzado muchas veces el stackoverflow y logré reducir mi problema tanto como pude.Usando en-memoria sqlite android

Lo único que no entiendo es cómo utilizar completamente una base de datos SQLite en memoria.

Aquí está mi situación: tengo una base de datos SQLite encriptada que descifro durante la carga de mi aplicación (esta parte funciona con seguridad). Mi clase que interactúa con la base de datos funciona con seguridad con una base de datos simple. Por lo tanto, para abreviar, todo es perfecto con un DB simple que se carga desde la memoria interna del teléfono, pero no estoy seguro de cómo o dónde almacenar el DB descifrado en la memoria para que se interprete como DB normal.

creo que debería poner null en lugar de un nombre en super(context, null, null, 3); y utilizar :memory: en lugar de un camino en SQLiteDatabase.openDatabase(), pero todavía no entienden completamente. Dice que no puede encontrar una tabla android_metadata, pero estoy seguro de que la base de datos está como debería.

Espero haber sido claro en esto :)

+0

Probado [SQLCipher] (http://sqlcipher.net/sqlcipher-for-android/)? – Jens

+0

No he pensado mucho. Un poco no lo encontré cuando estaba investigando por primera vez, así que desarrollé mi propio "cifrado" de 2 pasos. Gracias por el enlace, voy a echar un vistazo. ¿Puede decirme qué tan seguro es SQLCipher y comprime datos? – Grandpa

+0

El cifrado AES de 256 bits está bien, y no es probable que realice una mejor implementación por su cuenta, apostaría. – Jens

Respuesta

24

SQLiteOpenHelper() creará una base de datos en memoria si el name es null. Tenga en cuenta que se creará cuando invoque getWritableDatabase().

Luego debe insertar sus datos.

6

Usted (o el marco) crear una base de datos utilizando UNO de los siguientes:

  • SQLiteDatabase.create()
  • SQLiteDatabase.openDatabase()
  • SQLiteDatabase.openOrCreateDatabase()

La primera opción es la única manera de crear una base de datos solo de memoria, las otras dos abrir o crear un archivo de base de datos.

En consecuencia, si está utilizando SQLiteOpenHelper() y se pasa name como null, el marco llama SQLiteDatabase.create(null), por lo que obtendrá una base de datos que sólo vive en la memoria (que muere cuando close() se llama). No es necesario llamar también a uno de los otros métodos directos. En su lugar, llame al getReadableDatabase() o getWritableDatabase() desde su asistente.

+0

bien, entonces, ¿cómo uso una base de datos después de llamar 'myDatabase = SQLiteDatabase.create (null);'?Tengo el DB descifrado como bytes sin procesar en otra clase, ¿cómo fusiono esos bytes en el manejador de DB que se creó? – Grandpa

+0

No creo que sqlite3 admita "abrir" a: memory: base de datos de un blob existente, por lo que probablemente tampoco existan API en Android. Su mejor opción puede ser transmitir su base de datos descifrada a un archivo donde se puede abrir con una ruta válida usando 'openDatabase()'. Si no desea que la base de datos descifrada persista, puede copiar los datos en la versión de solo memoria mediante consultas/inserciones y luego cerrar/eliminar la versión del archivo. – Devunwired

+0

@Devunwired, cuando dices "se muere cuando se llama' close() '", ¿te refieres a 'SQLiteOpenHelper.close()', o 'SQLiteDatabase.close()'? ¿El cierre de una conexión de base de datos (a través de 'SQLiteDatabase.close()') destruirá la base de datos? – sotrh

0

Debe tener cuidado con el uso de inmemory, ya que sus datos se perderán una vez que se pierda la conexión db. Asegúrese de que su caso del DB no se ha cerrado

https://www.sqlite.org/inmemorydb.html