亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > SQLite > 正文

深入SQLite基本操作的總結詳解

2024-09-07 00:09:52
字體:
來源:轉載
供稿:網友

sqlite提供的是一些C函數接口,你可以用這些函數操作數據庫。通過使用這些接口,傳遞一些標準 sql 語句(以 char * 類型)給 sqlite 函數,sqlite 就會為你操作數據庫。sqlite 跟MS的access一樣是文件型數據庫,就是說,一個數據庫就是一個文件,此數據庫里可以建立很多的表,可以建立索引、觸發器等等,但是,它實際上得到的就是一個文件。備份這個文件就備份了整個數據庫。 sqlite 不需要任何數據庫引擎,這意味著如果你需要 sqlite 來保存一些用戶數據,甚至都不需要安裝數據庫。

下面開始介紹數據庫基本操作。
1、基本流程
(1)關鍵數據結構:
sqlite 里最常用到的是 sqlite3 * 類型。從數據庫打開開始,sqlite就要為這個類型準備好內存,直到數據庫關閉,整個過程都需要用到這個類型。當數據庫打開時開始,這個類型的變量就代表了你要操作的數據庫。下面再詳細介紹。
(2)打開數據庫:
int sqlite3_open( 文件名, sqlite3 ** ); 用這個函數開始數據庫操作。需要傳入兩個參數,一是數據庫文件名,比如:..//test//testDatabase.db。
文件名不需要一定存在,如果此文件不存在,sqlite 會自動建立它。如果它存在,就嘗試把它當數據庫文件來打開。 其中sqlite3 ** 參數即前面提到的關鍵數據結構。這個結構底層細節如何,你不要關它。
函數返回值表示操作是否正確,如果是 SQLITE_OK 則表示操作正常。相關的返回值sqlite定義了一些宏。具體這些宏的含義可以參考 sqlite3.h 文件。里面有詳細定義。
(3)關閉數據庫:
int sqlite3_close(sqlite3 *); 前面如果用 sqlite3_open 開啟了一個數據庫,結尾時不要忘了用這個函數關閉數據庫。
sqlite數據庫操作例子

復制代碼 代碼如下:www.49028c.com

#include "./sqlite3.h"
int main( int , char** )
{
sqlite3 * db = NULL; //聲明sqlite關鍵結構指針
int result;
//需要傳入 db 這個指針的指針,
//因為 sqlite3_open 函數要為這個指針分配內存,還要讓db指針指向這個內存區
result = sqlite3_open("..//test//testDatabase.db", &db);//打開數據庫
if( result != SQLITE_OK )
{
return -1; //數據庫打開失敗
}
//數據庫操作代碼
//…-
//數據庫打開成功
sqlite3_close( db ); //關閉數據庫
return 0;
}

這就是一次數據庫操作過程。

2、 SQL語句操作(如何用sqlite 執行標準 sql 語法)
(1)執行sql語句: int sqlite3_exec(sqlite3*, const char *sql, sqlite3_callback, void *, char **errmsg ); 這就是執行一條 sql 語句的函數。
參數說明:
第1個參數不再說了,是前面open函數得到的指針。說了是關鍵數據結構。
第2個參數const char *sql 是一條 sql 語句,以/0結尾。
第3個參數sqlite3_callback 是回調,當這條語句執行之后,sqlite3會去調用你提供的這個函數。
第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 把數據查出來,得通過回調告訴你查出了什么數據。
(2)exec 的回調 :typedef int (*sqlite3_callback)(void*,int,char**, char**); 你的回調函數必須定義成上面這個函數的類型。

sqlite數據庫操作例子:
復制代碼 代碼如下:www.49028c.com

//sqlite3的回調函數
// sqlite 每查到一條記錄,就調用一次這個回調
//para是你在 sqlite3_exec 里傳入的 void * 參數
//通過para參數,你可以傳入一些特殊的指針(比如類指針、結構指針),然后在這里面強制轉換成對應的類型
//(這里面是void*類型,必須強制轉換成你的類型才可用)。然后操作這些數據
//n_column是這一條記錄有多少個字段 (即這條記錄有多少列)
//char ** column_value 是關鍵值,查出來的數據都保存在這里,實際上是個1維數組(不要以為是2維數組),
//每一個元素都是一個 char * 值,是一個字段內容(用字符串來表示,以/0結尾)
//char ** column_name 跟 column_value是對應的,表示這個字段的字段名稱
int LoadMyInfo( void * para, int n_column, char ** column_value, char ** column_name )
{
//這里,我不使用 para 參數。忽略它的存在.
int i;
printf( "記錄包含 %d 個字段/n", n_column );
for( i = 0 ; i < n_column; i ++ )
{
printf( "字段名:%s ?> 字段值:%s/n", column_name[i], column_value[i] );
}
printf( "/n" );
return 0;
}

int main( int , char ** )
{
sqlite3 * db;
int result;
char * errmsg = NULL;
result = sqlite3_open("..//test//testDatabase.db", &db );
if( result != SQLITE_OK )
{
return -1; //數據庫打開失敗
}
//數據庫操作代碼
//創建測試表,表名叫 MyTable_1,有2個字段: ID 和 name。其中ID是一個自動增加的類型,
//以后insert時可以不去指定這個字段,它會自己從0開始增加
result = sqlite3_exec( db, "create table MyTable_1( ID integer primary key autoincrement, name nvarchar(32) ))", NULL, NULL, errmsg );
if(result != SQLITE_OK )
{
printf("創建表失敗,錯誤碼:%d,錯誤原因:%s/n", result, errmsg );
}
//插入一些記錄
result = sqlite3_exec( db, "insert into MyTable_1( name) values ('走路')", 0, 0, errmsg);
if(result != SQLITE_OK )
{
printf( “插入記錄失敗,錯誤碼:%d,錯誤原因:%s/n”, result, errmsg );
}

result = sqlite3_exec( db,"insert into MyTable_1( name ) values ('騎單車')", 0, 0, errmsg);
if(result != SQLITE_OK )
{
printf("插入記錄失敗,錯誤碼:%d,錯誤原因:%s/n", result, errmsg );
}

result = sqlite3_exec( db, "insert into MyTable_1( name ) values ( '坐汽車')", 0, 0, errmsg );
if(result != SQLITE_OK )
{
printf( "插入記錄失敗,錯誤碼:%d,錯誤原因:%s/n", result, errmsg );
}
result = sqlite3_exec( db, "select * from MyTable_1", LoadMyInfo, NULL, errmsg );//開始查詢數據庫 sqlite3_close( db ); //關閉數據庫
return 0;
}

通過上面的例子,應該可以知道如何打開一個數據庫,如何做數據庫基本操作。
(3)不使用回調查詢數據庫
sqlite3_exec 是使用回調來執行 select 操作。還有一個方法可以直接查詢而不需要回調。但是,我個人感覺還是回調好,因為代碼可以更加整齊,只不過用回調很麻煩,你得聲明一個函數,如果這個函數是類成員函數,你還不得不把它聲明成 static 的(C++成員函數實際上隱藏了一個參數:this,C++調用類的成員函數的時候,隱含把類指針當成函數的第一個參數傳遞進去。結果,這造成跟前面說的 sqlite 回調函數的參數不相符。只有當把成員函數聲明成 static 時,它才沒有多余的隱含的this參數)。雖然回調顯得代碼整齊,但有時候你還是想要非回調的 select 查詢。這可以通過 sqlite3_get_table 函數做到。
int sqlite3_get_table(sqlite3*, const char *sql, char ***resultp, int *nrow, int *ncolumn, char **errmsg );
參數說明:
第1個參數不再多說,看前面的例子。
第2個參數是 sql 語句,跟 sqlite3_exec 里的 sql 是一樣的。是一個很普通的以/0結尾的char *字符串。
第3個參數是查詢結果,它依然一維數組(不要以為是二維數組,更不要以為是三維數組)。它內存布局是:第一行是字段名稱,后面是緊接著是每個字段的值。下面用例子來說事。
第4個參數是查詢出多少條記錄(即查出多少行)。
第5個參數是多少個字段(多少列)。
第6個參數是錯誤信息,跟前面一樣,這里不多說了。
sqlite數據庫操作例子:
復制代碼 代碼如下:www.49028c.com

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("..//test//testDatabase.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]);
// dbResult 的字段值是連續的,從第0索引到第 nColumn - 1索引都是字段名稱
// 從第 nColumn 索引開始,后面都是字段值,
//它把一個二維的表(傳統的行列表示法)用一個扁平的形式來表示
++index;
}
printf( "/n" );
}
}
//到這里,不論數據庫查詢是否成功,都釋放 char** 查詢結果,使用 sqlite 提供的功能來釋放
sqlite3_free_table( dbResult );
sqlite3_close( db );//關閉數據庫
return 0;
}

到這個例子為止,sqlite3 的常用用法都介紹完了。 用以上的方法,完全可以應付絕大多數數據庫需求。

3、事務處理
sqlite 是支持事務處理的。如果你知道你要同步刪除很多數據,不仿把它們做成一個統一的事務。通常一次 sqlite3_exec 就是一次事務,如果你要刪除1萬條數據,sqlite就做了1萬次:開始新事務->刪除一條數據->提交事務->開始新事務->… 的過程。這個操作是很慢的。因為時間都花在了開始事務、提交事務上。你可以把這些同類操作做成一個事務,這樣如果操作錯誤,還能夠回滾事務。事務的操作沒有特別的接口函數,它就是一個普通的 sql 語句而已:
分別如下:
復制代碼 代碼如下:www.49028c.com

int result;
result = sqlite3_exec( db, "begin transaction", 0, 0, &zErrorMsg ); //開始一個事務
result = sqlite3_exec( db, "commit transaction", 0, 0, &zErrorMsg ); //提交事務
result = sqlite3_exec( db, "rollback transaction", 0, 0, &zErrorMsg ); //回滾事務

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩激情片免费| 亚洲激情成人网| 九九热精品视频在线播放| 91久久国产精品| 91av在线看| 91精品国产高清久久久久久| 亚洲精品av在线| 欧美性猛交xxxx免费看| 97在线视频免费观看| 久久久成人av| 日韩精品在线第一页| 久久久久久中文字幕| 精品免费在线观看| 日韩视频免费在线观看| 91高清视频免费观看| 亚洲精品久久久久久下一站| 成人av电影天堂| 亚洲福利视频久久| 在线观看欧美视频| 久久久国产精品免费| 日日骚久久av| 久国内精品在线| 91精品国产高清自在线看超| 日韩精品999| 国产一区二区视频在线观看| 国产热re99久久6国产精品| 海角国产乱辈乱精品视频| 国产精品久久久久久久app| 欧美成人一二三| 亚洲a区在线视频| 亚洲最大的免费| 久久久久久久久综合| 久久久久一本一区二区青青蜜月| 国产精品成人一区二区三区吃奶| 久久久女女女女999久久| 国产成人一区二区三区电影| 国产精品偷伦免费视频观看的| 日韩成人在线播放| 久久久久日韩精品久久久男男| 国产国产精品人在线视| 亚洲免费视频在线观看| 国产精品91一区| 深夜成人在线观看| 欧美性猛交xxxx免费看久久久| www.日韩不卡电影av| 中文字幕在线亚洲| 成人av.网址在线网站| 国产精品亚发布| 青青草99啪国产免费| 九九久久久久99精品| 欧美另类交人妖| 亚洲va久久久噜噜噜| 久久综合网hezyo| 欧美日韩国产在线看| 欧美性视频在线| 日韩电影免费观看中文字幕| 在线观看国产精品淫| 久久久久亚洲精品成人网小说| 777精品视频| 亚洲香蕉伊综合在人在线视看| 国产精品一区久久| 久久免费视频在线| 亚洲国产高潮在线观看| 日韩电影免费观看在线| 亚洲电影在线看| 伊人av综合网| 亚洲性视频网站| 欧美成人在线免费视频| 日本在线精品视频| 国产在线一区二区三区| 欧美一区二区影院| 国产91色在线免费| 日韩精品免费综合视频在线播放| 亚洲男女自偷自拍图片另类| 欧美激情一区二区久久久| 久久色在线播放| 欧美精品一区二区三区国产精品| 亚洲欧洲中文天堂| 国产日韩欧美另类| 秋霞午夜一区二区| 另类天堂视频在线观看| 成人天堂噜噜噜| 欧美最猛性xxxx| 欧美激情久久久| 欧美老女人www| 91美女片黄在线观看游戏| 久久久精品久久久久| 国产精品白嫩初高中害羞小美女| 欧美日韩国产色视频| 久久国产精品亚洲| 亚洲精品久久久久久久久| 91精品中国老女人| 欧美日韩午夜激情| 夜夜狂射影院欧美极品| 久久影院资源网| 久久久久久亚洲| 日韩在线不卡视频| 亚洲视频一区二区三区| 亚洲人成亚洲人成在线观看| 久久久免费精品视频| 欧美日韩亚洲高清| 亚洲伦理中文字幕| 国产精品久久色| 亚洲四色影视在线观看| 国产精品电影网| 国产拍精品一二三| 日韩av成人在线观看| 最近2019中文免费高清视频观看www99| 97香蕉超级碰碰久久免费的优势| 欧美一级bbbbb性bbbb喷潮片| 亚洲精品免费av| 亚洲免费电影在线观看| 国产精品h在线观看| 久久精品电影网站| 国产精品偷伦一区二区| 国产成人激情小视频| 国产精品亚洲аv天堂网| 久久91精品国产91久久久| 日韩高清免费在线| 亚洲乱亚洲乱妇无码| 成人欧美一区二区三区在线湿哒哒| 九九热精品在线| 久久精品精品电影网| 亚洲欧美日韩天堂一区二区| 91久久精品久久国产性色也91| 国产精品视频导航| 成人做爽爽免费视频| 尤物yw午夜国产精品视频| 这里只有精品丝袜| 国产精品高潮呻吟视频| 亚洲人成人99网站| 伊人久久久久久久久久久| 不卡av日日日| 久久精品影视伊人网| 久久91亚洲精品中文字幕奶水| 夜夜嗨av色综合久久久综合网| 日韩中文有码在线视频| 日韩av综合网站| 国产一区二区三区在线看| 亚洲偷欧美偷国内偷| 日韩成人中文字幕在线观看| 成人免费淫片aa视频免费| 欧美精品一本久久男人的天堂| 日韩精品极品毛片系列视频| 亚洲国产精品成人一区二区| 中文字幕亚洲欧美| 亲爱的老师9免费观看全集电视剧| 91亚洲va在线va天堂va国| 精品国产31久久久久久| 欧美日韩精品在线| 久久国产精品影片| 萌白酱国产一区二区| 国产一区二区在线播放| 久久久av电影| 欧美视频免费在线观看| 8090成年在线看片午夜| 欧美成人免费va影院高清| 欧洲日本亚洲国产区| 高清一区二区三区四区五区| 亚洲午夜色婷婷在线| 97久久精品人人澡人人爽缅北| 久久69精品久久久久久久电影好| 亚洲va欧美va国产综合剧情| 97在线免费观看|