一、SQLite簡介
SQLite 是用C語言編寫的開源數據庫,主要用於嵌入式,你也可以把它集成在自己的桌面程序中,也有人將其替代Access,用作後臺數據庫。
SQLite 支持多數SQL92標準,例如:索引、限制、觸發和查看支持。
支持 NULL、INTEGER、REAL、TEXT 和 BLOB 數據類型,支持事務。
二、下載SQLite
SQLite可以到官方站點下載
http://www.sqlite.org/download.html
包括:Linux,Mac OS X, Windows下的已編譯文件以及源代碼、幫助文檔。
SQLite瀏覽工具下載:http://sqliteadmin.orbmu2k.de/
三、SQLite使用
1、 數據庫連接、SQL解析接口:
sqlite3_open(); //以UTF-8方式打開
sqlite3_prepare()
sqlite3_step()
sqlite3_column()
sqlite3_finalize()
sqlite3_close()
2、sqlite3_column()
sqlite3_column_blob()
sqlite3_column_bytes()
sqlite3_column_bytes16()
sqlite3_column_count()
sqlite3_column_double()
sqlite3_column_int()
sqlite3_column_int64()
sqlite3_column_text()
sqlite3_column_text16()
sqlite3_column_type()
sqlite3_column_value()
3、SQL
sqlite> create table 數據庫 (名字, 嵌入式);
sqlite> insert into 數據庫 values ('SQLite','是');
ssqlite> select * from 數據庫;
sqlite> update 數據庫 set 名字='SQLite3' where 名字='SQLite';
sqlite> delete from 數據庫 where 嵌入式='是';
sqlite> .separator "-"
4、事務
result = sqlite3_exec(db, "BEGIN;", 0, 0, 0);//批量處理
for (int i=0; i<10000; i++)
{
//插入一條數據
result = sqlite3_exec(db,
"INSERT INTO MyTable (MyText, MyDate, MyTime, MyFloat) VALUES ('SQLITE3!', '2013-07-28', '23:00:00', 1000);",0, 0, 0);
}
result = sqlite3_exec(db, "COMMIT;", 0, 0, 0);
5、觸發器
假設"customers"表存儲了客戶信息,"orders"表存儲了訂單信息,下面的觸發器 確保當用戶 改變地址時所有的 關聯訂單地址均進行相應改變:
CREATE TRIGGER update_customer_address UPDATE OF address ON customers
BEGIN
UPDATE orders SET address = new.address WHERE customer_name = old.name;
END;
定義了該觸發器後執行如下語句:
UPDATE customers SET address = '1 Main St.' WHERE name = 'Jack Jones';
會使下面的語句自動執行:
UPDATE orders SET address = '1 Main St.' WHERE customer_name = 'Jack Jones';
注意,目前在有INTEGER PRIMARY KEY域的表上觸發器可能工作不正常。若 BEFORE觸發器修改 了一行的 INTEGER PRIMARY KEY域,而該域將由觸發該觸發器 的語句進行修改,則可能根本不 會修改該域。 可以用PRIMARY KEY字段代替 INTEGER PRIMARY KEY字段來解決上述問題。
6、SQL執行 回調 與 不回調
回調方案
int sqlite3_exec ( sqlite3 *db, // 使用 sqlite3_open () 打開的數據庫對象。
const char *sql, // 一條待查詢的 SQL 語句
sqlite3_callback, // 自定義的回調函數,對查詢結果每一行都執行一次這個函數
void *,
char **errmsg
);
這是最常用的執行 sql 語句的調用。簡單的參數含意標在上面函數中,下面對重
要參數含意詳細註釋:
- 第 4 個參數 "void *" 是調用者所提供的指針,可以傳遞任何一個指針參數到
這裏,這個參數最終會傳到回調函數裏面,這個指針比較重要,可以用來作參
數的傳遞。如果不需要傳遞指針給回調函數,可以填NULL。等下我們再看回調
函數的寫法,以及這個參數的使用。
- 第 5 個參數 "char ** errmsg" 是錯誤信息。注意是指針的指針。sqlite3裏
面有很多固定的錯誤信息。執行 sqlite3_exec 之後,執行失敗時可以查閱這
個指針(直接 printf(“%s\n”,errmsg))得到一串字符串信息,這串信息告訴
你錯在什麼地方。sqlite3_exec函數通過修改你傳入的指針的指針,把你提供
的指針指向錯誤提示信息,這樣sqlite3_exec函數外面就可以通過這個
char*得到具體錯誤提示。
說明:通常, sqlite3_callback 和它後面的 void * 這兩個位置都可以填
NULL。填NULL表示你不需要回調。比如你做 insert 操作,做 delete 操作,就
沒有必要使用回調。而當你做 select 時,就要使用回調,因爲 sqlite3 把數據
查出來,得通過回調告訴你查出了什麼數據。
** exec 的回調函數
typedef int(*sqlite3_callback) (void *, // 這就是上面函數傳遞的 void * 參數,需要強制類型轉換後才能使用。
int, // 查詢結果的列數,即有多少個字段數
char **, // 保存查詢結果
char ** // 各個字段的名字
);
不回調方案
int main( int , char ** )
{
sqlite3 * db;
int result;
char * errmsg = NULL;
char ** dbResult; //是 char ** 類型,兩個*號
int nRow, nColumn;
int i , j;
int index;
result = sqlite3_open( “c:\\database.db”, &db );
if( result != SQLITE_OK )
{
//數據庫打開失敗
return -1;
}
//數據庫操作代碼
//假設前面已經創建了 MyTable_1 表
//開始查詢,傳入的 dbResult 已經是 char **,這裏又加了一個 & 取地址符,傳遞進去的就成了 char ***
result = sqlite3_get_table( db, “select * from MyTable_1”, &dbResult, &nRow, &nColumn, &errmsg );
if( SQLITE_OK == result )
{
//查詢成功
index = nColumn; //前面說過 dbResult 前面第一行數據是字段名稱,從 nColumn 索引開始纔是真正的數據
printf( “查到%d條記錄\n”, nRow );
for( i = 0; i < nRow ; i++ )
{
printf( “第 %d 條記錄\n”, i+1 );
for( j = 0 ; j < nColumn; j++ )
{
printf( “字段名:%s ß> 字段值:%s\n”, dbResult[j], dbResult [index] );
++index; // dbResult 的字段值是連續的,從第0索引到第 nColumn - 1索引都是字段名稱,從第 nColumn 索引開始,後面都是字段值,它把一個二維的表(傳統的行列表示法)用一個扁平的形式來表示
}
printf( “-------\n” );
}
}
//到這裏,不論數據庫查詢是否成功,都釋放 char** 查詢結果,使用 sqlite 提供的功能來釋放
sqlite3_free_table( dbResult );
//關閉數據庫
sqlite3_close( db );
return 0;
}