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(),如果mNamenull,那么它会调用create方法进行in-内存数据库,而不是试图从磁盘打开一个。

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

那个 db 变量在 SQLiteOpenHelper 中维护,直到它关闭,对于内存数据库,这意味着数据被删除。


澄清一下,

使用内存数据库的 SQLiteOpenHelper 的每个实例都将拥有自己的数据库,而同一实例将使用一个数据库并保留该数据直到关闭。