android.database.sqlite.SQLiteOpenHelper
提供了使用内存数据库的能力,如果其构造函数的name参数为null
:
字符串:数据库文件,或者对于内存数据库为空
如果使用SQLiteOpenHelper
名称参数多次实例化null
,它们是否访问相同的内存数据库,或者每次都创建一个单独的内存数据库?
答案 0 :(得分:5)
来自SQLite官方文档 In-Memory Databases
打开两个数据库连接,每个连接都有文件名":memory:"将创建两个独立的内存数据库。
在Android中,传递null而不是":memory:"
因此,如果使用空名称参数多次实例化SQLiteOpenHelper,则每次创建单独的内存数据库
答案 1 :(得分: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()
或mName
,如果null
为create
,则会调用内存数据库的if (mName == null) {
db = SQLiteDatabase.create(null); // in-memory
} else {
// db file opened or created
}
...
return db;
方法而不是试图从磁盘中打开一个。
db
SQLiteOpenHelper
变量在SQLiteOpenHelper
中保留,直到它被关闭,在内存数据库中,这意味着数据被删除。
澄清,
使用内存数据库的int size = // ...
int[][][] array3d = new int[size][][];
// let's now store the arrays:
arrays3d[0] = some2darray;
// ...
的每个实例都是其自己的数据库,而同一实例将使用一个数据库并保留该数据直到它关闭。