2016-05-04 39 views
5

android.database.sqlite.SQLiteOpenHelper zapewnia możliwość korzystania z bazy danych w pamięci, jeśli nazwa argument do konstruktora jest null:SQLiteOpenHelper wielu baz danych w pamięci

String: w pliku bazy danych, lub null dla in-memory baza

Jeśli SQLiteOpenHelper jest tworzony kilka razy z null nazwy argumentu, mają one dostęp do tej samej bazy danych w pamięci lub jest oddzielną bazę danych w pamięci tworzony za każdym razem?

+0

Chcę powiedzieć, że jest taki sam, ponieważ jeśli używasz tego samego ciągu, to zawsze używany jest ten sam plik bazy danych. –

Odpowiedz

4

Od SQLite oficjalnej dokumentacji In-Memory Databases

Otwarcie dwóch połączeń z bazami danych, każdy z nazwą pliku „: pamięci:” stworzy dwa niezależne bazy danych w pamięci.

W Androidzie, przekaż wartość null zamiast „: pamięci:”

Tak więc, jeśli instancję SQLiteOpenHelper wielokrotnie z pustym nazwa argumentu następnie utworzyć oddzielne w pamięci bazy danych tworzone za każdym razem

+0

Zobacz odpowiedź @ cricket_007, aby dowiedzieć się więcej szczegółów, od kiedy zostały opublikowane podczas badania tego. 'SQLiteDatabaseConfiguration.MEMORY_DB_PATH =": memory: "', do którego odwołuje się 'SQLiteDatabase.create', aby utworzyć bazę danych z pamięcią. Przechodzi do 'openDatabase', która tworzy instancję' SQLiteDatabase' ze ścieżką '': memory:" '. – arcyqwerty

3

If patrzymy na source code, widzimy, że w konstruktorze mName zostanie ustawiony na 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; 
} 

Czyli getDatabaseName() powraca null.

public String getDatabaseName() { 
    return mName; 
} 

Później, dzięki zastosowaniu getReadableDatabase() lub getWritableDatabase(), jeśli mName jest null, to wywołuje metodę create do bazy danych w pamięci zamiast próbować otwierania jedną z dysku.

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

To db zmienna jest utrzymywana w SQLiteOpenHelper dopóki nie zostanie zamknięty, co w przypadku bazy danych w pamięci, oznacza, że ​​dane są usuwane.


celu wyjaśnienia,

Każda instancja SQLiteOpenHelper który korzysta z bazy danych w pamięci będzie własną bazę danych, podczas gdy ta sama instancja będzie wykorzystywać jedną bazę danych i utrzymywać, że dopóki nie zostanie zamknięty.

+0

Dziękujemy za zbadanie źródła. W połączeniu z odpowiedzią @ USKMobility, wygląda na to, że połączenia z tym samym 'SQLiteOpenHelper' przyniosłyby tę samą bazę danych (zakładając, że nie została ona zamknięta), a wywołania do różnych instancji' SQLiteOpenHelper' spowodowałyby utworzenie oddzielnych baz danych pamięci i dostęp do nich. – arcyqwerty

+0

To właśnie zebrałem z lektury kodu, tak. –