【问题标题】:SQLiteOpenHelper multiple in-memory databasesSQLiteOpenHelper 多个内存数据库
【发布时间】:2016-05-04 18:12:08
【问题描述】:

android.database.sqlite.SQLiteOpenHelper 提供了使用内存数据库的能力,如果其构造函数的名称参数是null

String: 数据库文件的字符串,对于内存数据库为 null

如果SQLiteOpenHelper 使用null 名称参数多次实例化,它们是访问同一个内存数据库还是每次都创建一个单独的内存数据库?

【问题讨论】:

  • @OneCricketeer 考虑到您添加了详尽的答案这一事实,我认为现在最好删除此误导性评论。

标签: android android-sqlite sqliteopenhelper


【解决方案1】:

来自 SQLite 官方文档In-Memory Databases

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

在 Android 中,传递 null 而不是 ":memory:"

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

【讨论】:

  • 请参阅@cricket_007 的答案以获取更多详细信息,因为这是在我研究此问​​题时发布的。 SQLiteDatabaseConfiguration.MEMORY_DB_PATH = ":memory:" 引用自 SQLiteDatabase.create 以创建内存支持的数据库。这将传递到openDatabase,它使用":memory:" 路径实例化SQLiteDatabase
【解决方案2】:

如果我们查看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(),如果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 的不同实例的调用会在内存数据库中创建和访问不同的数据库。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
相关资源
最近更新 更多