android.database.sqlite.SQLiteOpenHelper
提供了使用的內存數據庫的能力,如果名稱參數的構造函數是null
:SQLiteOpenHelper多個內存數據庫
字符串:數據庫文件,或者爲null,一個內存數據庫
如果SQLiteOpenHelper
與null
名參數多次實例化,難道他們訪問相同的內存數據庫或者是,在每次創建一個單獨的內存數據庫?
android.database.sqlite.SQLiteOpenHelper
提供了使用的內存數據庫的能力,如果名稱參數的構造函數是null
:SQLiteOpenHelper多個內存數據庫
字符串:數據庫文件,或者爲null,一個內存數據庫
如果SQLiteOpenHelper
與null
名參數多次實例化,難道他們訪問相同的內存數據庫或者是,在每次創建一個單獨的內存數據庫?
從SQLite的官方文檔In-Memory Databases
打開兩個數據庫中每個文件名連接「:記憶:」將創建兩個獨立的內存數據庫。
在Android中,傳遞null而不是「:記憶:」
所以,如果你有一個空名稱參數實例化SQLiteOpenHelper多次,然後它創建的內存數據庫每次
請參閱@ cricket_007的答案以瞭解更多詳情,因爲在我研究此問題時已發佈。 'SQLiteDatabaseConfiguration.MEMORY_DB_PATH =「:memory:」'從SQLiteDatabase.create'引用來創建內存支持的數據庫。這通過''openDatabase'來實例化'':memory:''路徑的'SQLiteDatabase'。 – arcyqwerty
如果設置了獨立的我們看看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()
,如果mName
是null
,那麼它要求的內存數據庫,而不是試圖從磁盤打開一個create
方法。
if (mName == null) {
db = SQLiteDatabase.create(null); // in-memory
} else {
// db file opened or created
}
...
return db;
即db
變量被保持在SQLiteOpenHelper
直到它被關閉時,其在內存數據庫的情況下,表示數據被刪除。
爲了澄清,
使用的內存數據庫將自己的數據庫,而相同的情況下將使用一個數據庫,直到關閉持久化數據的SQLiteOpenHelper
的每個實例。
感謝您的研究來源。結合@ USKMobility的回答,看起來對相同的'SQLiteOpenHelper'的調用會產生相同的數據庫(假設它沒有關閉),並且調用不同的'SQLiteOpenHelper'實例將創建和訪問單獨的內存數據庫。 – arcyqwerty
這就是我從閱讀代碼中得到的結果,是的。 –
我想說這是同一個,因爲如果你使用相同的字符串,那麼總是使用相同的數據庫文件。 –