目錄
一.數(shù)據(jù)庫(kù)基本概念(理解)
1.數(shù)據(jù)
2.數(shù)據(jù)庫(kù)
二.常用的數(shù)據(jù)的數(shù)據(jù)庫(kù)(了解)
1.大型數(shù)據(jù)庫(kù)
2.中型數(shù)據(jù)庫(kù)
3.小型數(shù)據(jù)庫(kù)
三.基于嵌入式的數(shù)據(jù)庫(kù)(了解)
四.SQLite基礎(chǔ)(了解)
五.創(chuàng)建數(shù)據(jù)庫(kù)(熟練)
1.手工創(chuàng)建
2.代碼創(chuàng)建
六.SQLite編程接口
七.代碼示例(學(xué)生管理系統(tǒng))
八.水果店鋪管理系統(tǒng)
一.數(shù)據(jù)庫(kù)基本概念(理解)
1.數(shù)據(jù)
????????能夠輸入計(jì)算機(jī)并能夠計(jì)算機(jī)程序識(shí)別和處理的信息集合。(不只是數(shù)字)
2.數(shù)據(jù)庫(kù)
????????數(shù)據(jù)庫(kù)是在數(shù)據(jù)庫(kù)管理系統(tǒng)管理和控制之下,存放在存儲(chǔ)介質(zhì)上的數(shù)據(jù)集合。
二.常用的數(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ǔ)(了解)
????????SQLite的源代碼是C,其源代碼完全開(kāi)放。SQLite第一個(gè)Alpha版本誕生于2000年5月。 他是一個(gè)輕量級(jí)的嵌入式數(shù)據(jù)庫(kù)。
SQLite有以下特性:
???????? 零配置一無(wú)需安裝和管理配置;
????????儲(chǔ)存在單一磁盤(pán)文件中的一個(gè)完整的數(shù)據(jù)庫(kù);
????????數(shù)據(jù)庫(kù)文件可以在不同字節(jié)順序的機(jī)器間自由共享;
????????支持?jǐn)?shù)據(jù)庫(kù)大小至2TB;
????????足夠小,全部源碼大致3萬(wàn)行c代碼,250KB;
????????比目前流行的大多數(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工具
? ? ? ?數(shù)據(jù)庫(kù)的安裝
?sudo dpkg -i ?*.deb //本地安裝包安裝
sudo apt-get install sqlite3 //在線安裝
????????數(shù)據(jù)庫(kù)常用命令
? ? ? ? (1)?系統(tǒng)命令都以“ . ”開(kāi)頭
.exit //退出
.quit //退出
.table //查看表
.schema <table_name> //查看表的結(jié)構(gòu)
.help //顯示所有命令
.database //顯示當(dāng)前打開(kāi)的數(shù)據(jù)庫(kù)文件
打開(kāi)數(shù)據(jù)庫(kù)文件?
在終端下運(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)sql執(zhí)行語(yǔ)句,都以“ ;”結(jié)尾
創(chuàng)建一張表
create table <table_name> (f1 type1, f2 type2,…);
crerate table stuinfo(id integer ,name char ,age intger,score float);
插入一條記錄?
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);
?查看數(shù)據(jù)庫(kù)記錄(where后面是條件)
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;
?刪除一條記錄
sqlite>delete from <table_name> where <expression>;
delete from stuinfo where id=1003 and name='zhangsan';
更新一條記錄?
sqlite>update <table_name> set <f1=value1>, <f2=value2>… where<expression>;
update stuinfo set age=20 where id=1003;
update stuinfo set age=30, score = 82 where id=1003;
?刪除一張表
drop table <table_name>
drop table stuinfo;
?增加一列
alter table <table> add column <field> <type> default …;
alter table stuinfo add column sex char;
?刪除一列(通過(guò)創(chuàng)建新的表來(lái)刪除)
create table stu as select id, name, score from stuinfo;
drop table stuinfo;
alter table stu rename to stuinfo;
2.代碼創(chuàng)建
????????在程序運(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ù)
六.SQLite編程接口
? ? ? ? 1.打開(kāi)(創(chuàng)建)sqlite數(shù)據(jù)庫(kù)
int sqlite3_open(char *path, sqlite3 **db);
path:數(shù)據(jù)庫(kù)文件路徑(數(shù)據(jù)庫(kù)名稱)
db:指向sqlite句柄的指針
返回值:成功返回0,失敗返回錯(cuò)誤碼(非零值)
? ? ? ? 2.關(guān)閉sqlite數(shù)據(jù)庫(kù) ? ? ??
int sqlite3_close(sqlite3 *db);
返回值:成功返回0,失敗返回錯(cuò)誤碼
? ? ? ? 3.得到錯(cuò)誤信息的描述
const char *sqlite3_errmg(sqlite3 *db);
返回值:返回錯(cuò)誤信息
? ? ? ? 4.執(zhí)行SQL語(yǔ)句操作?
Int sqlite3_exec(
sqlite3 *db,
const char *sql,
sqlite3_callback callback,
void *, char **errmsg
);
db:數(shù)據(jù)庫(kù)句柄
sql:SQL語(yǔ)句
callback:回調(diào)函數(shù)
errmsg:錯(cuò)誤信息指針的地址
返回值:成功返回0,失敗返回錯(cuò)誤碼
/* Callback function */
功能:查詢語(yǔ)句執(zhí)行之后,會(huì)回調(diào)此函數(shù)
查詢回調(diào)函數(shù):
int (*callback)(void* arg,int ncolumns ,char** f_value,char** f_name);
參數(shù):arg 接收sqlite3_exec 傳遞來(lái)的參數(shù)
ncolumns 列數(shù)(記錄中包含的字段數(shù)目)
f_value 列的值的地址(包含每個(gè)字段值的指針數(shù)組)
f_name 列的名稱(包含每個(gè)字段名稱的指針數(shù)組)
返回值:成功返回0,失敗返回-1
? ? ? ? 5.?不使用回調(diào)函數(shù)執(zhí)行SQL操作查詢
不使用回調(diào)函數(shù)執(zhí)行SQL語(yǔ)句
int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int*nrow, int *ncolumn, char **errmsg);
db:數(shù)據(jù)庫(kù)句柄
sql:SQL語(yǔ)句
resultp:用來(lái)指向sql執(zhí)行結(jié)果的指針
nrow:滿足條件的記錄的數(shù)目
ncolumn:每條記錄包含的字段數(shù)目
errmsg:錯(cuò)誤信息指針的地址
返回值:成功返回0,失敗返回錯(cuò)誤碼
七.代碼示例(學(xué)生管理系統(tǒng))
????????管理學(xué)生的信息文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-704104.html
八.水果店鋪管理系統(tǒng)
? ? ? ? 管理水果種類,重量,價(jià)格等信息和信息變動(dòng)記錄文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-704104.html
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sqlite3.h>
#include <time.h>
#define DATABASE "fruit.db"
#define TABLES "fruit"
#define N 128
int do_insert(sqlite3 *db,char *buf);
int do_update_weight(sqlite3 *db,char *buf);
int do_update_price(sqlite3 *db);
int do_query(sqlite3 *db);
int callback(void *arg, int f_num, char ** f_value, char ** f_name);
int main(int argc, const char *argv[])
{
sqlite3 *db;
char *errmsg;
int n;
char sql[128] = {};
char buf[128] = {};
time_t t;
struct tm *tp;
if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
{
printf("%s\n", sqlite3_errmsg(db));
return -1;
}
else
{
printf("open DATABASE success.\n");
}
sprintf(sql,"create table if not exists '%s' (id integer primary key autoincrement,name char,weight float,price float,time char);",TABLES);
if(sqlite3_exec(db, sql,NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("Create or open table success.\n");
}
time(&t);
tp = localtime(&t);
sprintf(buf,"%d-%02d-%02d %02d:%02d:%02d\n",tp->tm_year+1900, tp->tm_mon+1,tp->tm_mday, tp->tm_hour, tp->tm_min, tp->tm_sec);
printf("%s",buf);
while(1)
{
puts("-----------------------------------------");
do_query(db);
puts("-----------------------------------------");
puts("");
printf("********************************************\n");
printf("1: insert 插入 2:query 查詢 3:trade 交易 4:update 更新 5:quit 退出系統(tǒng)\n");
printf("********************************************\n");
printf("Please select:");
scanf("%d", &n);
switch(n)
{
case 1:
do_insert(db,buf);
break;
case 2:
do_query(db);
break;
case 3:
do_update_weight(db,buf);
break;
case 4:
do_update_price(db);
break;
case 5:
printf("main exit.\n");
sqlite3_close(db);
exit(0);
break;
default :
printf("Invalid data n.\n");
}
}
return 0;
}
int do_insert(sqlite3 *db,char *buf)
{
char name[32] = {};
float weight;
float price;
char sql[N] = {};
char *errmsg;
printf("Input fruit name:");
scanf("%s", name);
getchar();
printf("Input weight:");
scanf("%f", &weight);
printf("Input price:");
scanf("%f", &price);
sprintf(sql, "insert into '%s' (name,weight,price,time)values('%s', '%.3f', '%.3f','%s')",TABLES, name, weight, price,buf);
if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
{
printf("%s\n", errmsg);
}
else
{
printf("Insert done.\n");
}
return 0;
}
int do_update_weight(sqlite3 *db,char *buf)
{
int id;
char sql[N] = {};
char *errmsg;
float weight;
printf("Input id:");
scanf("%d", &id);
printf("Input weight:");
scanf("%f", &weight);
sprintf(sql, "update '%s' set weight='%f',time='%s' where id=%d",TABLES, weight,buf,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_price(sqlite3 *db)
{
float price;
int id;
char sql[N] = {};
char *errmsg;
printf("Input id:");
scanf("%d", &id);
printf("Input alter price:");
scanf("%f", &price);
sprintf(sql, "update '%s' set price='%f' where id=%d",TABLES , price,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 *arg, int f_num, char ** f_value, char ** f_name)
{
int i = 0;
for(i = 0; i < f_num; i++)
{
// printf("%-8s %s", f_value[i], f_name[i]);
printf("%-8s", f_value[i]);
}
putchar(10);
puts("-----------------------------------------");
return 0;
}
int do_query(sqlite3 *db)
{
char *errmsg;
char sql[N] = {};
sprintf(sql,"select * from '%s';",TABLES);
if(sqlite3_exec(db, sql, callback,NULL , &errmsg) != SQLITE_OK)
{
printf("%s", errmsg);
}
else
{
printf("select done.\n");
}
return 0;
}
到了這里,關(guān)于【嵌入式數(shù)據(jù)庫(kù)之sqlite3】的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!