2012-07-25 16 views
16


Ho letto, sfogliato, cercando molto su questo, ho passato avanti e indietro molte volte e sono riuscito a restringere il mio problema il più possibile.Utilizzo di in-memory sqlite android

L'unica cosa che non capisco, è come utilizzare in modo completamente un database SQLite in memoria.

Qui è la mia situazione - ho un database SQLite crittografato che decifro durante il caricamento della mia applicazione (questa parte funziona di sicuro). La mia classe che interagisce con il database funziona sicuramente con un semplice database. Quindi, per farla breve, tutto è impeccabile con un DB pianura che viene caricato dalla memoria interna del telefono, ma io non sono sicuro di come o dove memorizzare la decifrato DB nella memoria in modo che otterrebbe interpretato come normale DB.

Credo che dovrei mettere null invece di un nome in super(context, null, null, 3); e utilizzare :memory: invece di un percorso in SQLiteDatabase.openDatabase(), ma io ancora non comprendere appieno. Dice che non riesce a trovare una tabella android_metadata, ma sono certo che il database sia come dovrebbe essere.

Spero di essere stato chiaro su questo :)

+0

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

+0

Non ho pensato molto. Non l'ho trovato quando ho iniziato la ricerca, quindi ho sviluppato la mia "crittografia" in 2 fasi. Grazie per il link, darò un'occhiata. Puoi dirmi quanto è sicuro SQLCipher e comprime i dati? – Grandpa

+0

La crittografia AES a 256 bit è ok - e non è probabile che tu possa fare una migliore implementazione da solo. Scommetto. – Jens

risposta

24

SQLiteOpenHelper() creerà un database in memoria se il name è null. Si noti che verrà creato quando si invoca getWritableDatabase().

Poi si dovrebbe inserire i dati.

6

È (o quadro) di creare un database utilizzando ONE delle seguenti operazioni:

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

La prima opzione è l'unico modo per creare un database di sola memoria, gli altri due aprono o creano un file di database.

Di conseguenza, se si utilizza SQLiteOpenHelper() e si passa name come null, il framework chiama SQLiteDatabase.create(null), in modo da otterrete un database che vive solo nella memoria (muore quando close() si chiama). Non è necessario chiamare anche uno degli altri metodi diretti. Invece chiama getReadableDatabase() o getWritableDatabase() dal tuo aiutante.

+0

ok allora, Come si usa un database dopo che io chiamo 'myDatabase = SQLiteDatabase.create (null);'?Ho il DB decrittografato come byte non elaborati in un'altra classe, come faccio a unire questi byte nell'handle DB che è stato creato? – Grandpa

+0

Non credo che sqlite3 supporti "l'apertura" a: memoria: database da un blob esistente, quindi neanche le API in Android lo fanno probabilmente. La soluzione migliore potrebbe essere quella di far scorrere il database decrittografato in un file dove può essere aperto con un percorso valido usando 'openDatabase()'. Se non si desidera mantenere il database decrittografato, è possibile copiare i dati nella versione di sola memoria mediante query/inserimenti e quindi chiudere/rimuovere la versione del file. – Devunwired

+0

@Devunwired, quando si dice "muore quando' close() 'è chiamato", si fa riferimento a 'SQLiteOpenHelper.close()', o 'SQLiteDatabase.close()'? La chiusura di una connessione al database (tramite 'SQLiteDatabase.close()') distruggerà il database? – sotrh

0

bisogna essere attenti Wile utilizzando INT come i vostri dati saranno persi una volta che la connessione è persa db. Assicurarsi che il DB di istanza non è stata chiusa

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