android.database.sqlite.SQLiteOpenHelper
提供了使用的内存数据库的能力,如果名称参数的构造函数是null
:SQLiteOpenHelper多个内存数据库
字符串:数据库文件,或者为null,一个内存数据库
如果SQLiteOpenHelper
与null
名参数多次实例化,难道他们访问相同的内存数据库或者是,在每次创建一个单独的内存数据库?
android.database.sqlite.SQLiteOpenHelper
提供了使用的内存数据库的能力,如果名称参数的构造函数是null
:SQLiteOpenHelper多个内存数据库
字符串:数据库文件,或者为null,一个内存数据库
如果SQLiteOpenHelper
与null
名参数多次实例化,难道他们访问相同的内存数据库或者是,在每次创建一个单独的内存数据库?
从SQLite的官方文档In-Memory Databases
打开两个数据库中每个文件名连接“:记忆:”将创建两个独立的内存数据库。
在Android中,传递null而不是“:记忆:”
所以,如果你有一个空名称参数实例化SQLiteOpenHelper多次,然后它创建的内存数据库每次
请参阅@ cricket_007的答案以了解更多详情,因为在我研究此问题时已发布。 'SQLiteDatabaseConfiguration.MEMORY_DB_PATH =“:memory:”'从SQLiteDatabase.create'引用来创建内存支持的数据库。这通过''openDatabase'来实例化'':memory:''路径的'SQLiteDatabase'。 – arcyqwerty
如果设置了独立的我们看看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()
,如果mName
是null
,那么它要求的内存数据库,而不是试图从磁盘打开一个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
这就是我从阅读代码中得到的结果,是的。 –
我想说这是同一个,因为如果你使用相同的字符串,那么总是使用相同的数据库文件。 –