2016-05-04 81 views
5

android.database.sqlite.SQLiteOpenHelper提供了使用的內存數據庫的能力,如果名稱參數的構造函數是nullSQLiteOpenHelper多個內存數據庫

字符串:數據庫文件,或者爲null,一個內存數據庫

如果SQLiteOpenHelpernull名參數多次實例化,難道他們訪問相同的內存數據庫或者是,在每次創建一個單獨的內存數據庫?

+0

我想說這是同一個,因爲如果你使用相同的字符串,那麼總是使用相同的數據庫文件。 –

回答

4

從SQLite的官方文檔In-Memory Databases

打開兩個數據庫中每個文件名連接「:記憶:」將創建兩個獨立的內存數據庫。

在Android中,傳遞null而不是「:記憶:」

所以,如果你有一個空名稱參數實例化SQLiteOpenHelper多次,然後它創建的內存數據庫每次

+0

請參閱@ cricket_007的答案以瞭解更多詳情,因爲在我研究此問​​題時已發佈。 'SQLiteDatabaseConfiguration.MEMORY_DB_PATH =「:memory:」'從SQLiteDatabase.create'引用來創建內存支持的數據庫。這通過''openDatabase'來實例化'':memory:''路徑的'SQLiteDatabase'。 – arcyqwerty

3

如果設置了獨立的我們看看source code,我們看到在構造函數mName中將被設置爲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; 
} 

這意味着getDatabaseName()回報null

public String getDatabaseName() { 
    return mName; 
} 

後來,通過使用getReadableDatabase()getWritableDatabase(),如果mNamenull,那麼它要求的內存數據庫,而不是試圖從磁盤打開一個create方法。

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

db變量被保持在SQLiteOpenHelper直到它被關閉時,其在內存數據庫的情況下,表示數據被刪除。


爲了澄清,

使用的內存數據庫將自己的數據庫,而相同的情況下將使用一個數據庫,直到關閉持久化數據的SQLiteOpenHelper的每個實例。

+0

感謝您的研究來源。結合@ USKMobility的回答,看起來對相同的'SQLiteOpenHelper'的調用會產生相同的數據庫(假設它沒有關閉),並且調用不同的'SQLiteOpenHelper'實例將創建和訪問單獨的內存數據庫。 – arcyqwerty

+0

這就是我從閱讀代碼中得到的結果,是的。 –