SQLiteOpenHelper:多个内存数据库

7

android.database.sqlite.SQLiteOpenHelper 提供了使用内存数据库的功能,如果其构造函数的name参数为null

数据库文件名字符串,或为内存数据库而为null

如果多次使用SQLiteOpenHelper并将name参数设置为null,它们是访问同一个内存数据库还是每次都创建一个单独的内存数据库?


@OneCricketeer 考虑到您已经添加了详细的答案,我认为现在最好删除这个误导性的评论。 - Wolf
2个回答

8

来自SQLite官方文档内存数据库

打开两个文件名均为":memory:"的数据库连接将创建两个独立的内存数据库。

在Android中,将":memory:"替换为null即可

因此,如果您多次使用null名称参数实例化SQLiteOpenHelper,则每次都会创建单独的内存数据库


请参考@cricket_007的答案,因为我在研究这个问题时他已经发布了。SQLiteDatabaseConfiguration.MEMORY_DB_PATH = ":memory:"是从SQLiteDatabase.create引用的,用于创建一个内存支持的数据库。这将传递到openDatabase,它使用":memory:"路径实例化SQLiteDatabase - arcyqwerty

3
如果我们查看源代码,我们会发现在构造函数中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实例都有自己的数据库,而同一个实例将使用一个数据库并保留该数据,直到它被关闭。


感谢您对源代码进行研究。结合@USKMobility的答案,看起来对相同的“SQLiteOpenHelper”调用会产生相同的数据库(假设它没有被关闭),而对不同的“SQLiteOpenHelper”实例进行调用将创建并访问单独的内存数据库。 - arcyqwerty

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接