SQLite可说是某种「美德软件」(virtueware),作者本人放弃著作权,而给使用SQLite的人以下的「祝福」(blessing): May you do good and not evil.愿你行善莫行恶 May you find forgiveness for yourself and forgive others.愿你原谅自己宽恕他人 May you share freely,never taking more than you give.愿你宽心与人分享,所取不多于你所施予
优点:
支援大多数的SQL指令。 一个档案就是一个数据库。不需要安装数据库服务器软件。 完整的Unicode支援(因此没有跨语系的问题)。 速度很快。
建立数据库档案 用sqlite3建立数据库的方法很简单,只要在shell下键入: # sqlite3 foo.db如果目录下没有foo.db,sqlite3就会建立这个数据库。
使用.help可以取得求助,.quit则是离开(请注意:不是quit)
SQL的指令格式 所以的SQL指令都是以分号(;)结尾的。如果遇到两个减号(--)则代表注解,sqlite3会略过去。
建立资料表 假设我们要建一个名叫film的资料表,只要键入以下指令就可以了: create table film(title,length,year,starring);这样我们就建立了一个名叫film的资料表,里面有name、length、year、starring四个字段。 这个create table指令的语法为: create table table_name(field1,field2,field3,...);table_name是资料表的名称,fieldx则是字段的名字。sqlite3与许多SQL数据库软件不同的是,它不在乎字段属于哪一种资 料型态:sqlite3的字段可以储存任何东西:文字、数字、大量文字(blub),它会在适时自动转换。 建立索引 如果资料表有相当多的资料,我们便会建立索引来加快速度。好比说: create index film_title_index on film(title);意思是针对film资料表的name字段,建立一个名叫film_name_index的索引。这个指令的语法为 create index index_name on table_name(field_to_be_indexed);一旦建立了索引,sqlite3会在针对该字段作查询时,自动使用该索引。这一切的操作都是在幕后自动发生的,无须使用者特别指令。 加入一笔资料 接下来我们要加入资料了,加入的方法为使用insert into指令,语法为: insert into table_name values(data1,data2,data3,...);例如我们可以加入 insert into film values ('Silence of the Lambs,The',118,1991,'Jodie Foster');insert into film values ('Contact',153,1997,'Jodie Foster');insert into film values ('Crouching Tiger,Hidden Dragon',120,2000,'Yun-Fat Chow');insert into film values ('Hours,114,2002,'Nicole Kidman');如果该字段没有资料,我们可以填NULL。 查询资料 讲到这里,我们终于要开始介绍SQL最强大的select指令了。我们首先简单介绍select的基本句型: select columns from table_name where expression;最常见的用法,当然是倒出所有数据库的内容: select * from film;如果资料太多了,我们或许会想限制笔数: select * from film limit 10;或是照着电影年份来排列: select * from film order by year limit 10;或是年份比较
C/C++中调用SQLITE3的基本步骤
创建数据库:
sqlite3 *pDB = NULL; char * errMsg = NULL; //打开一个数据库,如果改数据库不存在,则创建一个名字为databaseName的数据库文件 int rc = sqlite3_open(databaseName,&pDB); if(rc) { cout << " Open the database " << databaseName << " failed" << endl; } //如果创建成功,添加表
else { cout << "create the database successful!" << endl; //creat the table int i; for(i=1; i
//函数参数:第一个为操作数据库的指针,第二句为SQL命令字符串
//第三个参数为callback函数,这里没有用,第四个参数为callback函数
//中的第一个参数,第五个为出错信息
rc = sqlite3_exec(pDB,"CREATE TABLE chn_to_eng(chinese QString,english QString)",&errMsg); if(rc == SQLITE_OK) cout << "create the chn_to_eng table successful!" << endl; else cout << errMsg << endl; //同上,插入另一个表
if(rc == SQLITE_OK) cout << "create the eng_to_chn table successful!" << endl; else cout << errMsg << endl; }
、、、、、、
//往表中添加数据
char chn[]="...";
char eng[]="...";
char value[500]; //定义一条参数SQL命令,其中chn,eng为需要插入的数据 sprintf(value,"INSERT INTO chn_to_eng(chinese,english) VALUES('%s','%s')",chn,eng); //use the SQLITE C/C++ API to create and adjust a database. rc = sqlite3_exec(pDB, value, 0,&errMsg);
//查询一条记录
char value[500];
//定义一条查询语句,其中条件为当english为target时的中文记录
//print_result_cb为callback函数,在其中可以得到查询的结果,具体见下文
print_result_cb,&errMsg); if(rc == SQLITE_OK) { cout << "select the record successful!" << endl; } else { cout << errMsg << endl; return false; }
.......
}
//callback回调函数print_result_cb的编写,其中data为sqlite3_exec中的第四个参数,第二个参数是栏的数目,第三个是栏的名字,第四个为查询得到的值。这两个函数输出所有查询到的结果
int print_result_cb(void* data,int n_columns,char** column_values, char** column_names) { static int column_names_printed = 0; int i; if (!column_names_printed) { print_row(n_columns,column_names); column_names_printed = 1; } print_row(n_columns,column_values); return 0; }
void print_row(int n_values,char** values) { int i; for (i = 0; i < n_values; ++i) { if (i > 0) { printf("t"); } printf("%s",values[i]); } printf("n"); } 大致过程就是如此,具体可以参考SQLITE的API函数说明,见www.sqlite.org
===================================================
SQLite语法备忘录
|