一、數(shù)據(jù)庫(kù)基本概念
????????數(shù)據(jù):能夠輸入計(jì)算機(jī)并能被計(jì)算機(jī)程序識(shí)別和處理的信息集合。
????????數(shù)據(jù)庫(kù):數(shù)據(jù)庫(kù)是在數(shù)據(jù)庫(kù)管理系統(tǒng)管理和控制之下,存放在存儲(chǔ)介質(zhì)上的數(shù)據(jù)集合。
二、常用的數(shù)據(jù)庫(kù)
1.大型數(shù)據(jù)庫(kù)
????????Oracle公司是最早開(kāi)發(fā)關(guān)系數(shù)據(jù)庫(kù)的廠商之一,其產(chǎn)品支持最廣泛的操作系統(tǒng)平臺(tái)。目前Oracle關(guān)系數(shù)據(jù)庫(kù)產(chǎn)品的市場(chǎng)占有率名列前茅。
????????IBM 的DB2是第一個(gè)具備網(wǎng)上功能的多媒體關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng),支持包Linux在內(nèi)的一系列平臺(tái)。
2.中型數(shù)據(jù)庫(kù)
????????Server是微軟開(kāi)發(fā)的數(shù)據(jù)庫(kù)產(chǎn)品,主要支持windows平臺(tái)。
3.小型數(shù)據(jù)庫(kù)
????????mySQL是一個(gè)小型關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),開(kāi)發(fā)者為瑞典MySQL AB公司,2008年被Sun公司收購(gòu),開(kāi)放源碼。
三、基于嵌入式的數(shù)據(jù)庫(kù)
基于嵌入式Linux的數(shù)據(jù)庫(kù)主要有SQLite, Firebird, Berkeley DB, eXtremeDB
Firebird是關(guān)系型數(shù)據(jù)庫(kù),功能強(qiáng)大,支持存儲(chǔ)過(guò)程、SQL兼容等
SQLite關(guān)系型數(shù)據(jù)庫(kù),體積小,支持ACID事務(wù)
Berkeley DB中并沒(méi)有數(shù)據(jù)庫(kù)服務(wù)器的概念,它的程序庫(kù)直接鏈接到應(yīng)用程序中
eXtremeDB是內(nèi)存數(shù)據(jù)庫(kù),運(yùn)行效率高
四、SQLite基礎(chǔ)
1.SQLite的源代碼是C,其源代碼完全開(kāi)放。SQLite第一個(gè)Alpha版本誕生于2000年5月。 他是一個(gè)輕量級(jí)的嵌入式數(shù)據(jù)庫(kù)。
2.SQLite有以下特性:
? ? ? ? (1)零配置一無(wú)需安裝和管理配置;
? ? ? ? (2)儲(chǔ)存在單一磁盤(pán)文件中的一個(gè)完整的數(shù)據(jù)庫(kù);
? ? ? ? (3)數(shù)據(jù)庫(kù)文件可以在不同字節(jié)順序的機(jī)器間自由共享;
? ? ? ? (4)支持?jǐn)?shù)據(jù)庫(kù)大小至2TB;
? ? ? ? (5)足夠小,全部源碼大致3萬(wàn)行c代碼,250KB;
? ? ? ? (6)比目前流行的大多數(shù)數(shù)據(jù)庫(kù)對(duì)數(shù)據(jù)的操作要快;
五、創(chuàng)建數(shù)據(jù)庫(kù)
1.手工創(chuàng)建
―使用SQLite3工具,通過(guò)手工輸入SQL命令行完成數(shù)據(jù)庫(kù)創(chuàng)建.
―用戶在Linux的命令行界面中輸入SQLite3可啟動(dòng)SQLite3工具
2.代碼創(chuàng)建
―在代碼中常動(dòng)態(tài)創(chuàng)建數(shù)據(jù)庫(kù)
―在程序運(yùn)行過(guò)程中,當(dāng)需要進(jìn)行數(shù)據(jù)庫(kù)操作時(shí),應(yīng)用程序會(huì)首先嘗試打開(kāi)數(shù)據(jù)庫(kù),此時(shí)如果數(shù)據(jù)庫(kù)并不存在,程序則會(huì)自動(dòng)建立數(shù)據(jù)庫(kù),然后再打開(kāi)數(shù)據(jù)庫(kù)
3.數(shù)據(jù)庫(kù)的安裝
本地安裝:sudo dpkg -i ?*.deb
在線安裝:sudo qpt-get install-sqlite3
六、SQLite常用命令介紹
1.在終端下運(yùn)行sqlite3?? <*.db>,出現(xiàn)如下提示符
―SQLite? version? 3.7.2
―Enter “.help” for instructions
―Enter SQL statements terminated with a “;”
―sqlite>
<*.db> 是要打開(kāi)的數(shù)據(jù)庫(kù)文件。若該文件不存在,則自動(dòng)創(chuàng)建
2.顯示所有命令:sqlite> .help
3.退出sqlite3:sqlite>.quit
4.顯示當(dāng)前打開(kāi)的數(shù)據(jù)庫(kù)文件:sqlite>.database
5.顯示數(shù)據(jù)庫(kù)中所有表名:sqlite>.tables
6.查看表的結(jié)構(gòu):―sqlite>.schema? <table_name>
/*******************************************/
7.以下為SQL命令,每個(gè)命令以;結(jié)束
(1)創(chuàng)建新表―sqlite>create? table? <table_name>? (f1? type1, f2? type2,…);
????????create table stuinfo(id integer, name text, age integer, score float);//創(chuàng)建表格
(2)刪除表―sqlite>drop? table? <table_name>
????????drop table stuinfo;
(3)查詢表中所有記錄―sqlite>select? *? from? <table_name>;
????????select? *? from? stu;//查詢所有字段
(4)按指定條件查詢表中記錄―sqlite>select? *? from? <table_name>? where? <expression>;
????????select * from stuinfo;//查詢所有字段
????????select * from stuinfo where score = 80;
????????select * from stuinfo where score = 80 and name= 'zhangsan';
????????select * from stuinfo where score = 80 or name='wangwu';
????????select name,score from stuinfo; ?查詢指定的字段
????????select * from stuinfo where score >= 85 and score < 90;
(5)向表中添加新記錄―sqlite>insert? into? <table_name>? values (value1, value2,…);
????????insert into stuinfo values(1001, 'zhangsan', 18, 80);
????????insert into stuinfo (id, name, score) values(1002, 'lisi', 90);
(6)按指定條件刪除表中記錄―sqlite>delete? from? <table_name>? where? <expression>
????????delete from stuinfo where id=1003 and name='zhangsan';
(7)更新表中記錄
―sqlite>update? <table_name>? set? <f1=value1>, <f2=value2>…?? where? <expression>;?
????????update stuinfo set age=20 where id=1003;//設(shè)置一個(gè)字段的更新
? ? ? ? update stuinfo set age=30, score = 82 where id=1003;//設(shè)置兩個(gè)字段的更新
(8)在表中添加字段―sqlite>alter table <table> add column <field> <type> default? …;
????????alter table stuinfo add column sex char;
(9)在表中刪除字段(刪除一列)
????????Sqlite中不允許刪除字段,可以通過(guò)下面步驟達(dá)到同樣的效果
????????sqlite> create table stu1 as select id, name, score from stu//創(chuàng)建一張新的表
????????sqlite> drop table stu//刪除原有的表
????????sqlite> alter table stu1 rename to stu//講新的表名字改成原有舊表的名字
數(shù)據(jù)庫(kù)設(shè)置主鍵:
? ? ?create table info(id integer primary key autoincrement, name vchar);
(10)創(chuàng)建帶約束數(shù)據(jù)表
創(chuàng)建表格的時(shí)候設(shè)置字段約束
PRIMARY KEY主鍵,NOT NULL不能為NULL,UNIQUE唯一,DEFAULT默認(rèn)值,ID INTEGER PRIMARY KEY AUTOINCREMENT id自動(dòng)增長(zhǎng)
以此表格為例:
(1)創(chuàng)建數(shù)據(jù)表
create ?table ?device ?(id ?integer primary key autoincrement,
? ? ? ? ? ? ? ? ? ? ? ? ?????????????????name ?varchar(256) unique ,
? ? ? ? ? ? ? ? ? ? ? ? ?????????????????status int not NULL default 0,
? ? ? ? ? ? ? ? ? ? ? ? ?????????????????online int not NULL);
創(chuàng)建時(shí)加入條件(表不存在是創(chuàng)建)
create table if not exists device(id integer primary key autoincrement,?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????????????name varchar(256) unique,?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????????????status int default 0,?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????????????? online int not NULL);
insert into stu(name, online) values('led6', 0);可以實(shí)現(xiàn)部分賦值,id值自增
七、SQLite編程接口
1. int?? sqlite3_open(char? *path,?? sqlite3 **db);
????????―功能:打開(kāi)sqlite數(shù)據(jù)庫(kù)
????????―path:數(shù)據(jù)庫(kù)文件路徑、
????????―db:指向sqlite句柄的指針、
????????―返回值:成功返回0,失敗返回錯(cuò)誤碼(非零值)
2. int?? sqlite3_close(sqlite3 *db);
????????―功能:關(guān)閉sqlite數(shù)據(jù)庫(kù)????????
????????―返回值:成功返回0,失敗返回錯(cuò)誤碼
3. const? char? *sqlite3_errmg(sqlite3 *db);????????
????????―返回值:返回錯(cuò)誤信息
4. Typedef? int (*sqlite3_callback)(void *, int,char **, char **);
5. Int sqlite3_exec(sqlite3 *db, const? char? *sql, sqlite3_callback callback, void *, char **errmsg);、
????????―功能:執(zhí)行SQL操作
????????―db:數(shù)據(jù)庫(kù)句柄
????????―sql:SQL語(yǔ)句
????????―callback:回調(diào)函數(shù)
????????―errmsg:錯(cuò)誤信息指針的地址
????????―返回值:成功返回0,失敗返回錯(cuò)誤碼
6. typedef? int (*sqlite3_callback)(void *para, int f_num, char **f_value, char **f_name);
????????―功能:每找到一條記錄自動(dòng)執(zhí)行一次回調(diào)函數(shù)
????????―para:傳遞給回調(diào)函數(shù)的參數(shù)
????????―f_num:記錄中包含的字段數(shù)目
????????―f_value:包含每個(gè)字段值的指針數(shù)組
????????―f_name:包含每個(gè)字段名稱的指針數(shù)組
????????―返回值:成功返回0,失敗返回-1
7.不使用回調(diào)函數(shù)執(zhí)行SQL語(yǔ)句
int?? sqlite3_get_table(sqlite3 *db, const? char? *sql,? char ***resultp,? int*nrow,? int *ncolumn, char **errmsg);
????????―功能:執(zhí)行SQL操作
????????―db:數(shù)據(jù)庫(kù)句柄
????????―sql:SQL語(yǔ)句
????????―resultp:用來(lái)指向sql執(zhí)行結(jié)果的指針
????????―nrow:滿足條件的記錄的數(shù)目
????????―ncolumn:每條記錄包含的字段數(shù)目
????????―errmsg:錯(cuò)誤信息指針的地址、
????????―返回值:成功返回0,失敗返回錯(cuò)誤碼
8.void sqlite3_free_table(char **result);//查詢文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-497835.html
任務(wù):假如我家開(kāi)了個(gè)水果超市,有以下水果,想實(shí)現(xiàn)自動(dòng)化管理,掃描二維碼就能知道當(dāng)前的水果狀態(tài),進(jìn)貨幾天了,
好久需要再次進(jìn)貨,那些水果暢銷(xiāo),那些水果不暢銷(xiāo),那些水果春夏秋冬的價(jià)格波動(dòng),好,那么現(xiàn)在我想將
這些信息保存在數(shù)據(jù)庫(kù)中,那么我應(yīng)該怎么做;
提示: 建立一張fruit表,
假如水果有: 蘋(píng)果,香蕉,梨,橘子,葡萄....(可以自己查一下英文保存到數(shù)據(jù)庫(kù))
水果價(jià)格: 蘋(píng)果 5元/斤 香蕉 3元/斤 梨 3.5元/斤 橘子2.5元/斤 葡萄 8元/斤....
當(dāng)前存貨: 蘋(píng)果 80斤 香蕉 200斤 梨 50斤 橘子300斤 葡萄 100斤....
超市每天水果都有進(jìn)貨和賣(mài)出嘛,水果的價(jià)格隨著季節(jié)和天氣也會(huì)有波動(dòng),顧客也會(huì)看一下每天水果的價(jià)格的嘛,
所以要求,根據(jù)上述提示,利用數(shù)據(jù)庫(kù)完成水果店各種水果的增(進(jìn)貨)刪(賣(mài)出)改(波動(dòng))查(看價(jià)格)功能。
并將進(jìn)出貨的時(shí)間和顧客光顧的時(shí)間記錄到數(shù)據(jù)庫(kù)中保存。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-497835.html
#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>
#define DATABASE "fruit.db"
int do_insert(sqlite3 * db){
int id;
char name[32] = {};
float price;
float stock;
char sql[128] = {};
char *errmsg;
printf("Input id:");
scanf("%d", &id);
getchar();
printf("Integer name:");
scanf("%s",name);
getchar();
printf("Input price:");
scanf("%f", &price);
getchar();
printf("Input stock:");
scanf("%f", &stock);
getchar();
sprintf(sql,"insert into fruit values(%d, '%s', %.1f, %.1f);", id, name, price, stock);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg)!= SQLITE_OK){
printf("%s\n", errmsg);
}else{
printf("Insert done.\n");
}
return 0;
}
int do_delete(sqlite3 * db){
int id;
char sql[128] = {};
char *errmsg;
printf("Input id:");
scanf("%d", &id);
getchar();
sprintf(sql,"delete from fruit where id=%d", id);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg)!= SQLITE_OK){
printf("%s\n", errmsg);
}else{
printf("Delete done.\n");
}
return 0;
}
int do_update(sqlite3 * db){
int id;
char sql[128] = {};
float price;
float stock;
char *errmsg;
printf("Input price:");
scanf("%f", &price);
getchar();
printf("Input stock:");
scanf("%f", &stock);
getchar();
printf("Input id:");
scanf("%d", &id);
getchar();
sprintf(sql,"update fruit set price = %.1f,stock = %.1f where id = %d",price, stock, id);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg)!= SQLITE_OK){
printf("%s\n", errmsg);
}else{
printf("update done.\n");
}
return 0;
}
int callback(void *para, int f_num, char **f_value, char **f_name){
int i = 0;
for(i = 0; i < f_num; i++){
printf("%-11s ", f_value[i]);
}
putchar(10);
return 0;
}
int do_query(sqlite3 * db){//查詢
char sql[128] = {};
char *errmsg;
sprintf(sql,"select * from fruit;");
if(sqlite3_exec(db, sql, callback, NULL, &errmsg)!= SQLITE_OK){
printf("%s\n", errmsg);
}else{
printf("query done.\n");
}
}
int do_query1(sqlite3 * db){//查詢
char sql[128] = {};
char *errmsg;
char **resultp;
int nrow;
int index;
int ncloumn;
int ret;
int i,j;
sprintf(sql,"select * from fruit;");
ret = sqlite3_get_table(db, sql, &resultp, &nrow,&ncloumn, &errmsg);
for(j = 0; j<ncloumn; j++){
printf("%-11s ", resultp[j]);
}
putchar(10);
index = ncloumn;
for(i = 0;i < nrow; i++){
for(j = 0; j<ncloumn; j++){
printf("%-11s ", resultp[index++]);
}
putchar(10);
}
if(ret != SQLITE_OK){
printf("%s\n", errmsg);
}else{
printf("Query done.\n");
}
return 0;
}
int main(int argc, char argv[]){
sqlite3 *db;
char *errmsg;
int cmd;
if(sqlite3_open(DATABASE, &db) != SQLITE_OK){
printf("%s\n", sqlite3_errmsg(db));
return -1;
}else{
printf("Open DATABASE success.\n");
}
//創(chuàng)建一張數(shù)據(jù)庫(kù)表格
if(sqlite3_exec(db, "create table fruit (id Integer , name char , price Integer, stock Integer);", NULL , NULL , &errmsg) != SQLITE_OK ){
printf("%s\n", errmsg);
}else{
printf("creat table or success.\n");
}
while(1){
printf("*******************************************************\n");
printf("1:insert 2:delete 3:query 4:update 5:quit.\n");
printf("*******************************************************\n");
printf("Input cmd:");
scanf("%d", &cmd);
getchar();
switch (cmd){
case 1:
do_insert(db);
break;
case 2:
do_delete(db);
break;
case 3:
//do_query(db);
do_query1(db);
break;
case 4:
do_update(db);
break;
case 5:
sqlite3_close(db);
exit(0);
defalut:
printf("Error cmd.\n");
}
}
return 0;
}
到了這里,關(guān)于嵌入式數(shù)據(jù)庫(kù)之sqlite3的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!