2012-04-30 7 views
1

私は文を使用してメモリデータベースで作成した:アクセス

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

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

ドキュメントは言う:

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

複数のメモリデータベースを作成すると、これらのデータベースに他のスレッドからどのようにアクセスできますか?

答えて

1

あなたのコード内のdb変数が作成されたSQLiteのDBオブジェクトへのポインタになり:

int sqlite3_open(
    const char *filename, /* Database filename (UTF-8) */ 
    sqlite3 **ppDb   /* OUT: SQLite db handle */ 
); 

のRef .: http://www.sqlite.org/capi3ref.html#sqlite3_open

これは、ステートメントを実行するために自分の別のスレッドで使用するポインタです。もしあれば、私は知らない

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 */ 
); 

のRef .: http://www.sqlite.org/c3ref/prepare.html

EDIT:たとえば、あなたがあなたのdbポインタを渡します先となる以下の機能を備えた書類を作成しますsqlite3_open(":memory:", ...)で開くメモリデータベースの名前を変更できますが、名前はありません。また、インメモリデータベースを追加することもできます。

最初に開いたメモリ内データベース名がmainである可能性があります。ステートメントpragma database_listを実行することで確認できます。

ATTACH DATABASE ':memory:' AS db2;のような文を実行することで、より多くのメモリ内データベースを接続できます。ここで

はsqlite3のクライアントを使用して、上記の簡単なデモです:

[[email protected] ~]$ 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 
+0

我々はメモリデータベースに名前を付けることはできますか?私はWebアプリケーションを作成しており、データベースからデータを取得する要求を送信しています。これらのデータベースにどのようにアクセスできますか? – Sandy

+0

@Sandy:私の更新を見てください。 –