パート3
このパートでは、プログラムインターフェイス(API)を使用してSQLiteを使用する際の困難な問題に対処します。
SQLite APIとは何ですか? これは、Cのsqlite3_XXX関数のセットです。
これらの関数のヘッダーはsqlite3.hにあり、1つの大きなHTML形式のAPIの説明はこちらです。
APIの使用を開始し、後で、居心地の良いフレームワークでラップする問題に進みます。
SQLiteデータベースで何かを行う小さなプロジェクトをC ++(MS Visual Studioで作成しました)で作成してみましょう。
プロジェクトでSQLiteを使用するには2つの方法があります。
コードを「コンパイル」します(CまたはC ++の場合)。 または、sqlite3.dllをダウンロードして使用します(SQLiteを簡単に更新でき、言語に関連付けられていません)。
いずれにしても、新しいプロジェクト(コンソール)アプリケーション(私はMS Visual Studioを使用しました)を作成し、ここにmain.cppを追加する必要があります。
#include <stdio.h>
#include "sqlite3.h"
const char * SQL = "foo(a、b、c)が存在しない場合にテーブルを作成します; FOO値に挿入(1,2,3); FOOに挿入しますSELECT * FROM FOO;" ;
int main ( int argc 、 char ** argv ) {
sqlite3 * db = 0 ; //データベース接続オブジェクトのハンドル
char * err = 0 ;
//接続を開きます
if ( sqlite3_open ( "my_cosy_database.dblite" 、 & db ) )
fprintf ( stderr 、 "データベースのオープン/作成エラー:%s \ n" 、 sqlite3_errmsg ( db ) ) ;
// SQLを実行します
else if ( sqlite3_exec ( db 、 SQL 、 0、0 、 & err ) )
{
fprintf ( stderr 、 "SQLエラー:%sn" 、 err ) ;
sqlite3_free ( err ) ;
}
//接続を閉じます
sqlite3_close ( db ) ;
0を 返し ます 。
}
さらに、プロジェクトをSQLiteコードと一緒にアセンブルする場合は、次のものが必要です。
- 統合としてソースコードをダウンロードします。
-sqlite3.hおよびsqlite3.cを抽出し、プロジェクトに追加します。
sqlite3.dllを使用する場合、必要です。
-SQLite DLLをダウンロードして解凍します。
-sqlite3.libを取得するために、解凍したフォルダーで「LIB.EXE /DEF:sqlite3.def」を実行します(lib.exeへのパスがvcvars32.batの呼び出しによって登録されていることを確認してください)。
-プロジェクトにsqlite3.libを含めます。
- 合併をダウンロードし 、そこからsqlite3.hを抽出します。
-プロジェクトにsqlite3.hを含めます。
コンパイル、実行します(2番目の場合、実行可能ファイルにDLLが使用可能でなければなりません)。
最初の起動時に、データベースを含むファイル「my_cosy_database.dblite」が作成されます。このファイルには、1つのテーブルと2つのレコードが含まれています。
その後の起動時に、プログラムは既存のデータベースに参加し、テーブル内のレコード数を2倍にします。
プロジェクトコードを扱いましょう。
SQLiteの使用は、何らかのデータベース(K.O.!)でSQLコマンドを実行することを前提としています。
Windowsでファイルを操作するようにSQLiteデータベースを操作することを想像できます。 ファイルを開き、特定のシステムオブジェクト(ファイル)が「バインド」されているファイルの_handle_を取得します。 このハンドルをさまざまな関数に渡して、システムにファイルを処理するように依頼します。 次に-ファイルを閉じます。 SQLiteでも。 データベースからファイルを開き、「データベースへの接続」オブジェクトのハンドルを取得します。 次に、このハンドルを受け取る関数を呼び出していくつかのSQLコマンドを実行し、最終的に接続を閉じます。
ご覧のとおり、ここにはオリジナル、特別、またはunningなものは何もありません。
SQLiteデータベースのファイル拡張子は標準化されていません。 一部は ".sqlite3"にしますが、任意に配置できます。
機能
int sqlite3_open (
const char * filename 、 / *データベースファイル名(UTF-8)* /
sqlite3 ** ppDb / * OUT:SQLite dbハンドル* /
) ;
指定されたファイル(UTF-8!)でデータベースを作成または開き、dbに接続ハンドルを配置します。 0(成功)またはエラーコードを返します。 とにかくsqlite3_closeの終了呼び出しが必要です(sqlite3_openエラーがあっても)。
機能
int sqlite3_exec (
sqlite3 *、 / *オープンデータベース* /
const char * sql 、 / *評価されるSQL(UTF-8)* /
int ( *コールバック) ( void *、 int 、 char **、 char ** ) 、 / *コールバック関数* /
void *、 / *コールバックの最初の引数* /
char ** errmsg / *ここに書き込まれたエラーメッセージ* /
) ;
指定された(開いている)データベース接続のコンテキストで(「;」で区切られたUTF-8の1つ以上のSQLステートメントで構成される)SQLコマンドを実行します。
SELECTが行われた場合(データを取得するため)、コールバック関数とそのカスタム引数が必要です。 これについては、使用するまで後で説明します。
errmsgパラメーターでは、エラーテキストを取得し、後でsqlite3_freeを使用してクリアできます。 ここにNULLを渡すと、エラーテキストは表示されません。
sqlite3_openと同様に、0またはエラーコードを返します。
CREATE TABLEコマンドには、IF NOT EXISTS句が含まれています。 つまり、テーブルが作成されていない場合は作成されます。 存在する場合、何も起こりません(エラーはありません)。
それだけです。 sqlite3_open(sqlite3_open_v2へのより強力な呼び出しがあります)もsqlite3_exec(通常、SQLのコンパイル、パラメーターのバインドなど)が実際のプロジェクトで使用されていないという事実にもかかわらず、これは非常に実用的なプロジェクトです。
さらに重要な使命があります。 各開始時に既に述べたように、fooテーブルの行数を2倍にします。 20回の開始後、テーブルには最大200万件のレコードが含まれます。
つまり 21回目の起動では、最大200万件のレコードが挿入されます。
私のマシン(Windows 7 x64、i5 2.8 Ghz、SSDではなくHDD)では、約15秒かかりました。 これは悲惨で総合的なテストですが、それにもかかわらず、SQLiteのパフォーマンスについての特定のアイデアが得られます。
継続する。