2016-05-04 39 views
5

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

字符串:数据库文件,或者为null,一个内存数据库

如果SQLiteOpenHelpernull名参数多次实例化,难道他们访问相同的内存数据库或者是,在每次创建一个单独的内存数据库?

+0

我想说这是同一个,因为如果你使用相同的字符串,那么总是使用相同的数据库文件。 –

回答

4

从SQLite的官方文档In-Memory Databases

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

在Android中,传递null而不是“:记忆:”

所以,如果你有一个空名称参数实例化SQLiteOpenHelper多次,然后它创建的内存数据库每次

+0

请参阅@ cricket_007的答案以了解更多详情,因为在我研究此问​​题时已发布。 'SQLiteDatabaseConfiguration.MEMORY_DB_PATH =“:memory:”'从SQLiteDatabase.create'引用来创建内存支持的数据库。这通过''openDatabase'来实例化'':memory:''路径的'SQLiteDatabase'。 – arcyqwerty

3

如果设置了独立的我们看看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的每个实例。

+0

感谢您的研究来源。结合@ USKMobility的回答,看起来对相同的'SQLiteOpenHelper'的调用会产生相同的数据库(假设它没有关闭),并且调用不同的'SQLiteOpenHelper'实例将创建和访问单独的内存数据库。 – arcyqwerty

+0

这就是我从阅读代码中得到的结果,是的。 –