2

次のステートメントを使用してメモリ内データベースを作成しました。

rc = sqlite3_open(":memory:", &db);

他のスレッドでこのデータベースにアクセスする必要があります (データを読み取るため)。他のスレッドでメモリ内データベースにアクセスする方法はありますか?

ドキュメントには次のように記載されています。

すべて:memory:のデータベースは、他のデータベースとは異なります。そのため、それぞれがファイル名を持つ 2 つのデータベース接続を開くと、:memory:2 つの独立したメモリ内データベースが作成されます。

複数のメモリ内データベースを作成する場合、他のスレッドからこれらのデータベースにアクセスするにはどうすればよいですか?

4

1 に答える 1

2

コード内の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
于 2012-04-30T12:32:08.060 に答える