国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
嵌入式數(shù)據(jù)庫(kù)SQLite3相關(guān)操作
嵌入式數(shù)據(jù)庫(kù)SQLite3相關(guān)操作---數(shù)據(jù)庫(kù)移植篇
一.準(zhǔn)備工作:
主機(jī)環(huán)境:虛擬機(jī)下Fedora9
交叉編譯器:arm-linux-gcc-4.4.3
軟件包:sqlite-3.6.18.tar.bz2
把sqlite-3.6.18.tar.bz2解壓到主機(jī)的/nfs_dir/目錄下,并重命名為sqlite,在同一級(jí)目錄下在新建目錄sqlite_arm,這個(gè)目錄來(lái)放編譯后產(chǎn)生的文件。
二.配置SQLite
在sqlite目錄終端下進(jìn)行如下配置:
./configure --prefix=/nfs/sqlite/sqlite_arm --disable-tcl --host=arm-linux
make
make install
經(jīng)過(guò)上述的命令將編譯好的文件安裝到sqlite-arm目錄下,在sqlite-arm目錄下會(huì)生成bin、lib、include目錄,bin目錄下是sqlite3可執(zhí)行文件,lib目錄下包含運(yùn)行sqlite3所依賴(lài)的庫(kù),include目錄下是sqlite的C語(yǔ)言API的頭文件,編程時(shí)會(huì)用到。
三.移植
分別將bin下的文件下載到開(kāi)發(fā)板的/usr/bin目錄中,lib下的所有文件下載到開(kāi)發(fā)板的/usr/lib目錄中即可。注意這里說(shuō)的是所有。包括符號(hào)連接,即一個(gè)不留:
cp –dr ./lib/ /usr/lib/
四.登錄開(kāi)發(fā)板的Linux,執(zhí)行:
sqlite3 demo.db
sqlite3是一個(gè)sqlite的命令行訪(fǎng)問(wèn)程序,demo.db是新建的數(shù)據(jù)庫(kù)的名字,必須以db作后綴。如果能進(jìn)行下邊的操作說(shuō)明一切OK.
#sqlite3 test.db
SQLite version 3.6.18
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table film (number,name);
sqlite> insert into film values (1,'aaa');
sqlite> insert into film values (2,'bbb');
sqlite> select * from film;
1|aaa
2|bbb
sqlite>.quit
五.測(cè)試程序
這里以SQLite官方站點(diǎn)http://sqlite.org的quick start文檔中的測(cè)試程序?yàn)槔龑?duì)移植到ARM-Linux上的SQLite3進(jìn)行測(cè)試。該程序清單如下:
#include <stdio.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
int i;
for(i=0; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
int main(int argc, char **argv)
{
sqlite3 *db;
char *zErrMsg = 0;
int rc;
if( argc!=3 ){
fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
}
rc = sqlite3_open(argv[1], &db);
if( rc ){
fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
sqlite3_close(db);
}
rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
if( rc!=SQLITE_OK ){
fprintf(stderr, "SQL error: %s\n", zErrMsg);
}
sqlite3_close(db);
return 0;
}
使用如下命令編譯測(cè)試程序:
arm-linux-gcc -o test test.c -lsqlite3 -L/nfs/sqlite/sqlite_arm/lib -I/nfs/sqlite/sqlite_arm/include
使用如下命令去掉調(diào)試信息:
arm-linux-strip test
六.在上面新建的數(shù)據(jù)庫(kù)目錄下測(cè)試:
#./test_sqlite   test.db   "select * from film"
應(yīng)該會(huì)看到如下的結(jié)果:
number = 1
name = aaa
number = 2
name = bbb
好了,挺簡(jiǎn)單的吧,sqlite也是一個(gè)關(guān)系性數(shù)據(jù)庫(kù),可以做的其實(shí)也是比較少的,或者說(shuō)要學(xué)的新東西還是挺少的,以前的數(shù)據(jù)庫(kù)連oracle,DB2都玩的轉(zhuǎn),何況這個(gè)小家伙,塞牙縫都不夠啊.下節(jié)我們會(huì)講講sqlite3中的一些基本的編程接口,有了這些接口,C編程問(wèn)題還不是手到擒來(lái)啊.
嵌入式數(shù)據(jù)庫(kù)SQLite3相關(guān)操作---操作接口篇
在上節(jié)中,我們介紹了有關(guān)SQLite3移植到開(kāi)發(fā)板的過(guò)程,這節(jié)就大家總結(jié)了一下SQLite3提供的C語(yǔ)言編程接口,以供大家編程時(shí)使用方便。
首先要說(shuō)明的是。sqlite3本身是提供了一些命令來(lái)操作數(shù)據(jù)庫(kù)的。為了與SQL語(yǔ)句相區(qū)別,他們都是以小數(shù)點(diǎn).開(kāi)頭??梢杂?div style="height:15px;">
.help  獲取相關(guān)命令
一,打開(kāi)和關(guān)閉數(shù)據(jù)庫(kù)
使用SQLite3接口操作數(shù)據(jù)庫(kù)時(shí)都要先打開(kāi)數(shù)據(jù)庫(kù),有點(diǎn)多余啊,哪個(gè)數(shù)據(jù)庫(kù)不是呢?嘿嘿
int sqlite3_open(const char *filename, sqlite3 **ppDb);
參數(shù)即返回值意義如下:
filename:要打開(kāi)的數(shù)據(jù)庫(kù)的文件名
ppDb:用戶(hù)返回?cái)?shù)據(jù)庫(kù)句柄
返回值:SQLITE_OK代表成功,否則為錯(cuò)誤碼
其實(shí)返回的錯(cuò)誤碼可以在SQLite3源碼的sqlite3.h頭文件找到,這里就不說(shuō)了。需要說(shuō)明的是這些錯(cuò)誤是SQLite3編程接口共同使用的。而不是sqlite3_open函數(shù)私有。
用完了,當(dāng)然要關(guān)閉:
int sqlite3_close(sqlite3 *ppDb);
二,執(zhí)行SQL語(yǔ)句
SQLite3提供了一個(gè)一般化的編程接口,可以對(duì)以打開(kāi)的數(shù)據(jù)庫(kù)執(zhí)行任何SQL語(yǔ)句。這個(gè)函數(shù)的原型如下:
int sqlite3_exec(sqlite3 *pDb, const char *sql,
int (*callback)(void* context, int nArg, char** azArg, char** azCol),
void *context, char **errmsg);
參數(shù)即返回值意義如下:
pDb:已打開(kāi)的數(shù)據(jù)庫(kù)的句柄
sql:字符串,內(nèi)容是一條或多條sql語(yǔ)句
callback:回調(diào)函數(shù)
context:傳遞給回調(diào)函數(shù)的第一個(gè)參數(shù),可稱(chēng)上下文參數(shù)
errmsg:指向一個(gè)字符串,其內(nèi)容是對(duì)操作中發(fā)生的錯(cuò)誤的文字描述
返回值:SQLITE_OK代表成功,否則為錯(cuò)誤碼
回調(diào)函數(shù)的作用是:當(dāng)進(jìn)行查詢(xún)操作時(shí),每查詢(xún)到一條記錄都會(huì)調(diào)用一次回調(diào)函數(shù),這條記錄的內(nèi)容通過(guò)回調(diào)函數(shù)的參數(shù)傳入?;卣{(diào)函數(shù)的參數(shù)既返回值的含義解釋如下:
context:調(diào)用sqlite3_exec時(shí)傳入的context指針。
nArg:數(shù)據(jù)的個(gè)數(shù)
azArg:字符串?dāng)?shù)組,有nArg個(gè)元素,表示每個(gè)字段的值
azCol:字符串?dāng)?shù)組,有nArg個(gè)元素,表示每個(gè)字段的名稱(chēng)
返回值:0表示要繼續(xù)查詢(xún)否則查詢(xún)操作結(jié)束,對(duì)sqllite3_exe函數(shù)的調(diào)用將返回錯(cuò)誤碼SQLITE_ABORT.
即使記錄中某個(gè)字段的類(lèi)型為整數(shù),它的值也是由C語(yǔ)言的字符串來(lái)代表中。
還有就是errmsg參數(shù)是一個(gè)字符指針變量的地址,通過(guò)它將得到一個(gè)字符串的首地址。顯然,這個(gè)字符串的存儲(chǔ)空間是在sqlite3_exec函數(shù)內(nèi)動(dòng)態(tài)分配得到的,因此用過(guò)后必須釋放以免造成內(nèi)存泄漏。鑒于外界并不知道sqlite3_exe函數(shù)內(nèi)部是如何進(jìn)行內(nèi)存分配的。SQLite3平臺(tái)專(zhuān)門(mén)提供了一個(gè)函數(shù)用于釋放這塊內(nèi)存,其原型如下:
void sqlite3_free(void *p);
其中參數(shù)P指向要釋放的內(nèi)存。
三.查詢(xún)數(shù)據(jù)庫(kù)
其實(shí)呢,使用上面的sqlite3_exec函數(shù)就可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行查詢(xún)操作,但它使用回調(diào)函數(shù)作為返回結(jié)果的手段,有時(shí)不是很方便,因此SQLite3也提供了一個(gè)專(zhuān)門(mén)的接口進(jìn)行查詢(xún)操作,其函數(shù)原型如下:
sqlite3_get_table(sqlite3 *pDb, const char *sql, char ***pResult, int *nrow, int *ncolumn, char **errmsg);
其中各個(gè)參數(shù)的含義解釋如下:
pDb:已打開(kāi)的數(shù)據(jù)庫(kù)的實(shí)例
sql:字符串,內(nèi)容是一條或多條SQL語(yǔ)句。
pResult:一個(gè)(char **)型變量的地址,用于返回查詢(xún)結(jié)果,查詢(xún)結(jié)果由字符串?dāng)?shù)組代表。
nrow:結(jié)果表的行數(shù)。
ncolumn:結(jié)果的列數(shù)
errmsg:指向一個(gè)字符串,其內(nèi)容是對(duì)操作中發(fā)生的錯(cuò)誤的文字描述
這里的參數(shù)都好理解,不好理解的是pResult是查詢(xún)的結(jié)果,它是一個(gè)字符串?dāng)?shù)組,因此它的首地址是(char **)地址。雖然它是一個(gè)一維的字符串?dāng)?shù)組,但要以二維的方式去理解,其中前ncolumn個(gè)字符串表示結(jié)果表的字段名,隨后的ncolumn個(gè)字符串則是第一條記錄的各個(gè)字段的值,依次類(lèi)推。
內(nèi)外一個(gè)需要說(shuō)明的問(wèn)題就是空間的問(wèn)題,顯然pResult所指向的字符串?dāng)?shù)組及各個(gè)字符串所占的空間都是在sqlite3_get_table函數(shù)內(nèi)部動(dòng)態(tài)分配得到的。因此需要使用后進(jìn)行釋放。由于它又不是一塊平坦的內(nèi)存,故也不能用sqlite3_free函數(shù)來(lái)釋放,而必須用下面這個(gè)專(zhuān)用的函數(shù):
void sqlite3_free_table(char **result);
其中,result參數(shù)就是查詢(xún)得到的結(jié)果表的首地址。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶(hù)發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
C++操作SQLite簡(jiǎn)明教程
[原創(chuàng)] Xcode中使用sqlite3訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)
Sqlite3小結(jié)(小型數(shù)據(jù)庫(kù)中增刪改查的操作)
如何用C語(yǔ)言操作sqlite3,一文搞懂
sqlite3——sqlite3應(yīng)用相關(guān)函數(shù)
用sqlite執(zhí)行標(biāo)準(zhǔn)SQL語(yǔ)法
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服