SQLite文件數(shù)據(jù)庫、內(nèi)存數(shù)據(jù)庫建立及導(dǎo)入導(dǎo)出
目錄(?)[+]
一、初識(shí)sqlite
?????????偶然的機(jī)會(huì)接觸到sqlite,不禁驚嘆sqlite的體型小巧而功能強(qiáng)大(看來軟件也不可貌相哦),Sqlite 是開源的內(nèi)存數(shù)據(jù)庫(也可以稱之為內(nèi)嵌式數(shù)據(jù)庫),大量無私的程序員為sqlite發(fā)展貢獻(xiàn)了自己的力量。Sqlite 應(yīng)用極廣,手機(jī)、mp3,機(jī)頂盒可能存在sqlite身影,Apple的Mac os,linux,或者windows在安裝第三方軟件時(shí)也可以應(yīng)用sqlite。
?????????Sqlite技術(shù)優(yōu)點(diǎn):
1.??Sqlite輕量級、跨平臺(tái)的關(guān)系型開源內(nèi)存數(shù)據(jù)庫,使用sqlite只需帶上動(dòng)態(tài)庫,就可使用sqlite全部功能(動(dòng)態(tài)庫Windows下487KB,Linux下347KB);
2.???核心引擎不依賴第三方軟件,也不需要安裝;
3.???數(shù)據(jù)庫中所有的信息(比如表、視圖、觸發(fā)器、等)都包含在一個(gè)文件內(nèi)。這個(gè)文件可以copy到其它目錄或其它機(jī)器上,也照用不誤。如果使用內(nèi)存方式,可以沒有該文件;
4.???除了主流操作系統(tǒng),SQLite還支持了很多冷門的操作系統(tǒng)。它對很多嵌入式系統(tǒng)(比如Android、Windows Mobile、Symbin、Palm、VxWorks等)也支持;
5.???SQLite的API不區(qū)分當(dāng)前操作的數(shù)據(jù)庫是在內(nèi)存還是在文件(對于存儲(chǔ)介質(zhì)是透明的);
等等;
???????? 缺點(diǎn):
1.??? 并發(fā)訪問的鎖機(jī)制
SQLite在并發(fā)(包括多進(jìn)程和多線程)讀寫方面的性能不太理想。數(shù)據(jù)庫可能會(huì)被寫操作獨(dú)占,從而導(dǎo)致其它讀寫操作阻塞或出錯(cuò);2.???? SQL標(biāo)準(zhǔn)支持不全
如不支持外鍵約束;
??????????看來還是優(yōu)點(diǎn)多于缺點(diǎn)!呵呵!
二、sqlite體系機(jī)構(gòu)
?????????????? sqlite模塊將 查詢過程分為幾個(gè)不連續(xù)的任務(wù),在結(jié)構(gòu)棧的頂部編譯查詢語句,中不執(zhí)行,在底部處理操作系統(tǒng)的存儲(chǔ)和接口。
?
??????????? ???????????????????????????????????????? ???????圖1-2SQLite的體系結(jié)構(gòu)
(注:結(jié)構(gòu)圖轉(zhuǎn)載于《SQLite權(quán)威指南》)
三、sqlite文件數(shù)據(jù)庫、內(nèi)存數(shù)據(jù)庫建立及導(dǎo)入導(dǎo)出
?????????? sqlite官網(wǎng)(www.sqlite.org)同時(shí)提供已編譯版本和源程序。同時(shí)適用于Windows和linux。
?????????? 經(jīng)過前面sqlite熱身之后,趕緊轉(zhuǎn)入正題,干點(diǎn)正事!(*^__^*)
3.1 文件數(shù)據(jù)庫、內(nèi)存數(shù)據(jù)庫的建立 3.1.1文件數(shù)據(jù)庫的建立
Windows:
1)? 下載sqlite最新版本sqlite3.exe;
2)? dos進(jìn)入到執(zhí)行程序目錄下;
3)? 輸入 sqlite3? d:test.db(如果后面執(zhí)行路徑存在test.db 則打開數(shù)據(jù)庫;如果執(zhí)行路徑下不存在test.db則新建test.db);
Linux:
1)? 下載sqlite最新版本sqlite3;
2)? Shell進(jìn)入到可知性程序目錄下;
3) 輸入sqlite3? /home/test.db(如果后面執(zhí)行路徑存在test.db 則打開數(shù)據(jù)庫;如果執(zhí)行路徑下不存在test.db則新建test.db);
至此則打開或者新建一個(gè)文件數(shù)據(jù)庫庫;
3.1.2 內(nèi)存數(shù)據(jù)庫的建立
[cpp]?view plaincopyprint? C代碼示例:?? ?? sqlite3?*db;?? ?? rc?=?sqlite3_open(":memory:",&db);????//?內(nèi)存中創(chuàng)建一個(gè)數(shù)據(jù)庫?? ?? 3.2?文件數(shù)據(jù)庫、內(nèi)存數(shù)據(jù)庫的導(dǎo)入導(dǎo)出?? ?? C代碼示例:?? ?? ////////////////////////////////////////////////////////////////////////////////////////////?? ?? //參數(shù)說明:?? ?? //pInMemory:?指向內(nèi)存數(shù)據(jù)庫指針?? ?? //zFilename:?指向文件數(shù)據(jù)庫目錄的字符串指針?? ?? //isSave??0:?從文件數(shù)據(jù)庫載入到內(nèi)存數(shù)據(jù)庫?1:從內(nèi)存數(shù)據(jù)庫備份到文件數(shù)據(jù)庫?? ?? ////////////////////////////////////////////////////////////////////////////////////////////?? ?? int?loadOrSaveDb(sqlite3?*pInMemeory,?const?char?*zFilename,?int?isSave)?? ?? {?? ?? ?????????int?rc;?? ?? ?????????sqlite3?*pFile;?? ?? ?????????sqlite3_backup?*pBackup;?? ?? ?????????sqlite3?*pTo;?? ?? ?????????sqlite3?*pFrom;?? ?? ?????????rc?=?sqlite3_open(zFilename,?&pFile);?? ?? ?????????if(rc?==?SQLITE_OK)?? ?? ?????????{?? ?? ???????????????????pFrom?=?(isSave?pInMemeory:pFile);?? ???????????????????pTo?=?(isSave?pFile:pInMemeory);?? ?? ???????????????????pBackup?=?sqlite3_backup_init(pTo,"main",pFrom,"main");?? ?? ???????????????????if(pBackup)?? ???????????????????{?? ????????????????????????????(void)sqlite3_backup_step(pBackup,-1);?? ????????????????????????????(void)sqlite3_backup_finish(pBackup);?? ???????????????????}?? ?? ???????????????????rc?=?sqlite3_errcode(pTo);?? ?? ?????????}?? ?? ?????????(void)sqlite3_close(pFile);?? ?? ?????????return?rc;?? }??
?調(diào)用實(shí)例:
[cpp]?view plaincopyprint? int?ret?=?0;?? ?? char?*filename?=?“d:\test.db”;?? sqlite3?*memoryDb;?? ?? ret?=?sqlite3_open(“memory:”,?&memoryDb);?? ret?=?loadOrSaveDb(memoryDb,?filename,?0)?//文件數(shù)據(jù)庫導(dǎo)入到內(nèi)存數(shù)據(jù)庫??
3.3 文件數(shù)據(jù)庫命令格式的導(dǎo)入導(dǎo)出
???????? 3.3.1 文件數(shù)據(jù)庫命令格式數(shù)據(jù)導(dǎo)出、備份
方法一:(sqlite數(shù)據(jù)庫內(nèi)部)
Sqlite>.output d:test.sql
Sqlite>.dump
Sqlite>.output stdout
方法二:(dos命令行)
sqlite3 525.db .dump>haha.sql
3.3.2文件數(shù)據(jù)庫命令格式數(shù)據(jù)導(dǎo)入sqlite>.read? file.sql
???????????? 今天暫且到這了,to be continue……