SQLiteOpenHelper 多个内存数据库
SQLiteOpenHelper multiple in-memory databases
android.database.sqlite.SQLiteOpenHelper
提供了使用内存数据库的能力,如果其构造函数的名称参数是 null
:
String: of the database file, or null for an in-memory database
如果使用 null
名称参数多次实例化 SQLiteOpenHelper
,它们访问同一个内存数据库还是每次都创建一个单独的内存数据库?
来自SQLite官方文档In-Memory Databases
打开两个文件名为“:memory:”的数据库连接将创建两个独立的内存数据库。
在 Android 中,传递 null 而不是“:memory:”
因此,如果您使用空名称参数多次实例化 SQLiteOpenHelper,那么每次都会创建单独的内存数据库
如果我们查看 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()
returnsnull
。
public String getDatabaseName() {
return mName;
}
之后,通过使用getReadableDatabase()
或getWritableDatabase()
,如果mName
是null
,那么它会调用create
方法进行in-内存数据库,而不是试图从磁盘打开一个。
if (mName == null) {
db = SQLiteDatabase.create(null); // in-memory
} else {
// db file opened or created
}
...
return db;
那个 db
变量在 SQLiteOpenHelper
中维护,直到它关闭,对于内存数据库,这意味着数据被删除。
澄清一下,
使用内存数据库的 SQLiteOpenHelper
的每个实例都将拥有自己的数据库,而同一实例将使用一个数据库并保留该数据直到关闭。
android.database.sqlite.SQLiteOpenHelper
提供了使用内存数据库的能力,如果其构造函数的名称参数是 null
:
String: of the database file, or null for an in-memory database
如果使用 null
名称参数多次实例化 SQLiteOpenHelper
,它们访问同一个内存数据库还是每次都创建一个单独的内存数据库?
来自SQLite官方文档In-Memory Databases
打开两个文件名为“:memory:”的数据库连接将创建两个独立的内存数据库。
在 Android 中,传递 null 而不是“:memory:”
因此,如果您使用空名称参数多次实例化 SQLiteOpenHelper,那么每次都会创建单独的内存数据库
如果我们查看 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()
returnsnull
。
public String getDatabaseName() {
return mName;
}
之后,通过使用getReadableDatabase()
或getWritableDatabase()
,如果mName
是null
,那么它会调用create
方法进行in-内存数据库,而不是试图从磁盘打开一个。
if (mName == null) {
db = SQLiteDatabase.create(null); // in-memory
} else {
// db file opened or created
}
...
return db;
那个 db
变量在 SQLiteOpenHelper
中维护,直到它关闭,对于内存数据库,这意味着数据被删除。
澄清一下,
使用内存数据库的 SQLiteOpenHelper
的每个实例都将拥有自己的数据库,而同一实例将使用一个数据库并保留该数据直到关闭。