android.database.sqlite.SQLiteOpenHelper
提供了使用内存数据库的功能,如果其构造函数的name参数为null
:
数据库文件名字符串,或为内存数据库而为null
如果多次使用SQLiteOpenHelper
并将name参数设置为null
,它们是访问同一个内存数据库还是每次都创建一个单独的内存数据库?
android.database.sqlite.SQLiteOpenHelper
提供了使用内存数据库的功能,如果其构造函数的name参数为null
:
数据库文件名字符串,或为内存数据库而为null
如果多次使用SQLiteOpenHelper
并将name参数设置为null
,它们是访问同一个内存数据库还是每次都创建一个单独的内存数据库?
来自SQLite官方文档内存数据库
打开两个文件名均为":memory:"的数据库连接将创建两个独立的内存数据库。
在Android中,将":memory:"替换为null即可
因此,如果您多次使用null名称参数实例化SQLiteOpenHelper,则每次都会创建单独的内存数据库
SQLiteDatabaseConfiguration.MEMORY_DB_PATH = ":memory:"
是从SQLiteDatabase.create
引用的,用于创建一个内存支持的数据库。这将传递到openDatabase
,它使用":memory:"
路径实例化SQLiteDatabase
。 - arcyqwertymName
将被设置为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
实例都有自己的数据库,而同一个实例将使用一个数据库并保留该数据,直到它被关闭。