SQLiteOpenHelper多个内存数据库

时间:2016-05-04 18:12:08

标签: android android-sqlite sqliteopenhelper

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

  

字符串:数据库文件,或者对于内存数据库为空

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

2 个答案:

答案 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,如果nullcreate,则会调用内存数据库的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; // ... 的每个实例都是其自己的数据库,而同一实例将使用一个数据库并保留该数据直到它关闭。