2016-05-04 11 views
5

android.database.sqlite.SQLiteOpenHelper offre la possibilità di utilizzare un database in memoria se il nome argomento di suo costruttore è null:SQLiteOpenHelper più database in memoria

String: del file di database, o nullo per un in-memory banca dati

Se SQLiteOpenHelper è istanziato più volte con un argomento null nome, fanno accedere allo stesso database in memoria o non è un database separato in-memory creato ogni volta?

+0

Voglio dire che è lo stesso perché se si utilizza la stessa stringa, viene sempre utilizzato lo stesso file di database. –

risposta

4

Da SQLite documentazione ufficiale In-Memory Databases

apertura di due connessioni al database ognuna con il nome del file ": la memoria:" creerà due database indipendenti in memoria.

In Android, passare null invece di ": la memoria:"

Quindi, se si crea un'istanza di SQLiteOpenHelper più volte con un argomento nome nulla allora creare separata in memoria del database creato ogni volta

+0

Vedere la risposta di @ cricket_007 per ulteriori dettagli da quando è stato pubblicato mentre stavo facendo ricerche su questo. 'SQLiteDatabaseConfiguration.MEMORY_DB_PATH =": memoria: "' a cui si fa riferimento da 'SQLiteDatabase.create' per creare un database con memoria supportata. Passa a 'openDatabase' che crea un'istanza di' SQLiteDatabase' con il percorso '': memory: "'. – arcyqwerty

3

Se guardiamo allo source code, vediamo che nel costruttore mName si imposterebbe su null.

public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version, 
     DatabaseErrorHandler errorHandler) { 
    if (version < 1) throw new IllegalArgumentException("Version must be >= 1, was " + version); 

    mContext = context; 
    mName = name; 
    mFactory = factory; 
    mNewVersion = version; 
    mErrorHandler = errorHandler; 
} 

Il che significa getDatabaseName() rendimenti null.

public String getDatabaseName() { 
    return mName; 
} 

Successivamente, attraverso l'uso di getReadableDatabase() o getWritableDatabase(), se mName è null, poi chiama il metodo create per un database in memoria invece di cercare di aprire uno dal disco.

if (mName == null) { 
    db = SQLiteDatabase.create(null); // in-memory 
} else { 
    // db file opened or created 
} 
... 
return db; 

Tale db variabile viene mantenuta nella SQLiteOpenHelper finché non viene chiusa, che nel caso di un database in memoria, significa che i dati vengono eliminati.


Per chiarire,

Ogni istanza di un SQLiteOpenHelper che utilizza un database in memoria sarà proprio database mentre la stessa istanza utilizzerà un database e persistere che dati finché non viene chiuso.

+0

Grazie per la ricerca della fonte. Combinato con la risposta di @ USKMobility, sembra che le chiamate allo stesso 'SQLiteOpenHelper' creino lo stesso database (supponendo che non sia stato chiuso) e le chiamate a diverse istanze di' SQLiteOpenHelper' creerebbero e accedessero ai database separati. – arcyqwerty

+0

Questo è quello che ho imparato leggendo il codice, sì. –

Problemi correlati