sqlite 3使用手記


先日openfetionのログイン速度が遅すぎるという問題を解決するために、データのローカライズ機能を実現することを決定しました.従来はバイナリファイルを用いてディスクに直接書き込む形式の効率と柔軟性が明らかに十分ではありませんでした.そこで、思い切ってsqlite 3を採用することにしました.sqlite 3は独自の利点があり、簡単で使いやすく、非常に効率的であり、当初はこの依存ライブラリを導入する際にためらっていたが、完成後、ユーザー体験がインストール時の小さなステップの煩雑さを絶対に隠すことができることが分かった.
sqlite 3は初めて使って、簡単に自分の使用過程を書いて、後で参考にすることができます.
sqlite 3は多くの通過するSQL文に対してすべて支持して、SELECT、UPDATE、INSERT、DELETEなどはすべて支持してとても良くて、SQL文を理解するだけでsqlite 3を使うことができます.
1、以下はいくつかの重要なAPI関数です.
/*      ,           */
int sqlite3_open(const char*, sqlite3**);
 
/*       */
int sqlite3_close(sqlite3*);
 
/*           */
const char *sqlite3_errmsg(sqlite3*);
 
/*   SQL   */
int sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void*, char**);
 
/*   SQL    ,             ,          ,         BLOG     ,  ,                ,                ,         ,           */
int sqlite3_get_table(
  sqlite3 *db,          /* An open database */
  const char *zSql,     /* SQL to be evaluated */
  char ***pazResult,    /* Results of the query */
  int *pnRow,           /* Number of result rows written here */
  int *pnColumn,        /* Number of result columns written here */
  char **pzErrmsg       /* Error msg written here */
);

いくつかの複雑なAPIは以下のように、私はよく見ていません.sqlite 3のように.get_tableこれらの関数は、以下のAPIを組み合わせたものです.
INT sqlite3_prepare(sqlite3*, const CHAR*, INT, sqlite3_stmt**, const CHAR**);
INT sqlite3_bind_double(sqlite3_stmt*, INT, DOUBLE);
INT sqlite3_bind_int(sqlite3_stmt*, INT, INT);
INT sqlite3_bind_int64(sqlite3_stmt*, INT, long long INT);
INT sqlite3_bind_null(sqlite3_stmt*, INT);
INT sqlite3_bind_text(sqlite3_stmt*, INT, const CHAR*, INT n, void(*)(void*));
INT sqlite3_bind_text16(sqlite3_stmt*, INT, const void*, INT n, void(*)(void*));
INT sqlite3_step(sqlite3_stmt*);

2、自己成長タイプのフィールドを作成する
CREATE TABLE history (id INTEGER PRIMARY KEY AUTOINCREMENT,
			name TEXT,userid TEXT,message TEXT,
			updatetime TEXT,issend INTEGER);

この文で作成されたidフィールドは自己成長フィールドであり、レコードを挿入するときにidフィールドをNULLと書くだけで自己成長を実現します.
INSERT INTO history VALUES(NULL,"levin","123456","hello sqlite3","2010-10-23",1);

3.sqlite 3の制限リード数
/*    SQL    SELECT            :*/
SELECT TOP 10 * FROM history;
 
/*   sqlite3       :*/
SELECT * FROM history LIMIT 10

4.sqlite 3の日付関数
sqlite 3の日付関数は強力で、よく使われるものをいくつか挙げます.
/*        */
SELECT DATETIME('now')2010-10-23 12:10:50
 
/*          */
SELECT DATETIME('now','+20 days');
  :2010-11-12 12:12:54
 
/*          */
SELECT DATETIME('now','start of year');
  :2010-01-01 00:00:00
 
/*          */
SELECT DATETIME('now','start of month');
  :2010-10-01 00:00:00
 
/*          */
SELECT DATETIME('now','start of day');
  :2010-10-23 00:00:00

また、sqlite 3には重要な時間関数、strftimeがあります.これはPOSIXのstrftime関数に似ています.日付タイプを文字列タイプにフォーマットしています.
SELECT strftime('%Y|%m|%d','now');
2010|10|23

フォーマット文字はPOSIXのstrftimeと全く同じです.例えば、今月のチャット記録を調べるには、次の文を使用します.
SELECT * FROM history WHERE 
strftime('%Y',updatetime) == strftime('%Y','now') AND
strftime('%m',updatetime) == strftime('%m','now') ;

5.大きなデータを书く时にトランザクションを采用して効率を高める私はsqlite 3を応用する时実はただ少量のデータを书いただけで、最初は効率が大した问题ではないと感じて、后でユーザーのフィードバックは彼の290+友达の飞信号が登录する时にディスクに数十Sのデータを书くと言って、この効率の问题は本当に改善する必要があって、そこでトランザクションを采用して书き込みを処理して、トランザクションの使用も簡単ですが、実は次の文です.
sqlite3_exec(db, "BEGIN TRANSACTION;", 0,0, &errMsg);
 
for(;;){
  insert into.....
}
 
sqlite3_exec(db, "COMMIT TRANSACTION;", 0, 0, &errMsg);

このように一連の挿入文を一つの事務として実行することができ、COMMIT TRANSACTIONの時に挿入操作をディスクに書き込むことで、記録を挿入するたびに頻繁にディスクデータベースを読み書きすることを回避し、効率を大幅に向上させ、単純に挿入するよりも1000倍速くできるというのは考証できないが、私のところは確かにずっと速くなった.数百の記録は瞬時に書き込むことができる.
昨日、ある学部の学生は私にsqliteができるかどうかを聞いて、私はちょうど2日前にも使って、彼女と交流して、彼女は私にどのように多くのデータを書くかを聞いて、ええと.この問題はとても簡単で、循環で、プログラムの中で循環して、SQLの中で循環してsqlite 3を使うのはできないと思って、sqlite 3は多くのデータベースのとても重要な特性を無視したため、それはストレージの過程を支持しないで、その上その他のデータベースの地の高い同時性もなくて、そのためある時私の複数のスレッドは同時に同じデータベースのファイルにアクセスする時、database is lockedと間違えて報告されます.
OK、以上は私個人の使用過程の中の少しの小さい総括だけで、持ってきて使って、あまり研究していません.sqlite 3のいくつかの複雑なメカニズムはすべて理解していません.これらの基礎的なものを書いて、自分にバックアップをして、いつまた使うか分かりません.
オリジナル文章、転載は明記してください:basic coderから転載します
リンク先:http://basiccoder.com/sqlite3-usage.html