我使用以下语句创建了一个内存数据库:
rc = sqlite3_open(":memory:", &db);
我需要在其他线程中访问这个数据库(用于读取数据)。有没有办法在其他线程的内存数据库中访问它?
文档说:
每个
:memory:
数据库都彼此不同。因此,打开两个各自具有文件名的数据库连接:memory:
将创建两个独立的内存数据库。
如果我在内存中创建多个数据库,如何从其他线程访问这些数据库?
我使用以下语句创建了一个内存数据库:
rc = sqlite3_open(":memory:", &db);
我需要在其他线程中访问这个数据库(用于读取数据)。有没有办法在其他线程的内存数据库中访问它?
文档说:
每个
:memory:
数据库都彼此不同。因此,打开两个各自具有文件名的数据库连接:memory:
将创建两个独立的内存数据库。
如果我在内存中创建多个数据库,如何从其他线程访问这些数据库?
代码中的db
变量成为指向创建的 SQLite db 对象的指针:
int sqlite3_open(
const char *filename, /* Database filename (UTF-8) */
sqlite3 **ppDb /* OUT: SQLite db handle */
);
参考:http ://www.sqlite.org/capi3ref.html#sqlite3_open
这是您将在不同线程中用来执行语句的指针。例如,您使用以下函数准备语句,并将db
指针传递给该函数:
int sqlite3_prepare(
sqlite3 *db, /* Database handle */
const char *zSql, /* SQL statement, UTF-8 encoded */
int nByte, /* Maximum length of zSql in bytes. */
sqlite3_stmt **ppStmt, /* OUT: Statement handle */
const char **pzTail /* OUT: Pointer to unused portion of zSql */
);
参考:http ://www.sqlite.org/c3ref/prepare.html
编辑:
我不知道您是否可以更改您打开的内存数据库的名称sqlite3_open(":memory:", ...)
,但它确实有一个名称。您还可以附加其他内存数据库。
最初打开的内存数据库名称很有可能是main
. 您可以通过运行语句来验证这一点pragma database_list
。
您可以通过运行诸如ATTACH DATABASE ':memory:' AS db2;
.
这是使用 sqlite3 客户端的上述快速演示:
[someone@somewhere ~]$ sqlite3
SQLite version 3.7.7.1 2011-06-28 17:39:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .headers on
sqlite> pragma database_list;
seq|name|file
0|main|
sqlite> attach database ':memory:' AS db2;
sqlite> pragma database_list;
seq|name|file
0|main|
2|db2|
sqlite> create table main.foo (bar int);
sqlite> create table db2.foo (bar int);
sqlite> insert into main.foo values (5);
sqlite> insert into db2.foo select * from main.foo;
sqlite> select * from db2.foo;
bar
5