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