Ø前言:
sqlite是目前最流行的开源嵌入式数据库,支持标准sql语法、事务、数据表和索引等,还具有平台无缝移植性。大家都知道嵌入式系统要求实时性比较强,而且本身内存比较有限,放不了那些大型的本地数据库,所以这种轻量级的高速的可靠的数据库也就受到欢迎。最近自学了这数据库,根据自己所走的弯路,花了大半天总结了这篇入门文档,希望对想学的人有点帮助,当然这里讲的都是最基础最简单的,只能帮助你入门,如果要深究,还有很多的东西要学。
Ø首先安装步骤:
1)在shell命令窗口敲入:sudoapt-getinstallsqlitesqlite3
2)在shell命令窗口敲入:sudoapt-getinstalllibsqlite3-dev
说明:网上很多资料没提到这点,这是编译时所需的第三方库,不安装是没 办法编译的。建议不要手动安装该安装包,因为这样软件的一些依赖关系 我们没办法知道,所以容易造成安装不成功。
Ø测试是否安装成功:
1)在shell命令窗口敲入:sqlite3-version
若安装成功,则显示出以下信息,当然版本若有更新,显示信息不一样
3.7.9 2011-11-01 00:52:41c7c6050ef060877ebe77b41d959e9df13f8c9b5e
Ø下载失败几点说明:
1)可能由于网络阻塞导致下载失败,所以可以在shell命令窗口敲入:
sudo /etc/init.d/networking restart //重启网络
2)也可能由于网络没联上网,这时可以在shell命令窗口敲入:
ping @L_404_0@
若显示:ping:unknown host www.baidu.com
则说明网络不可用,特别有的局域网,在联网时,很多配置是动态分配 的,所以DNS很容易莫名其妙的丢失,需重新配置下DNS,这时可以在shell 命令窗口敲入:
sudo vi /etc/resolv.conf(默认情况这个文件是不存在的),直接在文 件末尾添加如下内容:
nameserver 202.96.134.133
再在shell命令窗口敲入:
sudo /etc/init.d/networking restart //重启网络
1)sqlite库的建立
a.在shell命令窗口敲入:sqlite3test.db3
说明:其中test.db3是你要建立的数据库名字
2)创建一个数据表
a. 敲入:createtableuser_table(food_id,food_name,food_price,...);
说明:其中user_table是你要建的数据表的名字,如可以用menu_table, 其中food_id,food_name,...是你要建立的表的各列字段名称。
1)插入一条记录
a.insert intouser_table(food_id,...)values(1,‘菜名’,12,...);
b.例如:
insert intomenu_table(food_id,food_price)values(1,‘四 季豆肉丝’,11);
2)删除一条记录
a.delete fromuser_table where condition;
说明:其中user_table是所建立的数据表的名字,condition是指定的条件, 这样能指定删除哪一条记录,不写的话是删除整个表,需谨慎!
b.例如:delete from menu_tablewhere food_id = 1;
3)修改一条记录
a.update user_tableset update_list wherecondition;
说明:其中只有user_table,update_list,condition是变动的,user_table是所建 立的数据表 的名字,update_list是所要更改的数据列表,condition是指定的 条件,这样能指定更改那一条记录,否则将更改整个表。
b.例如:update menu_table setfood_id = 2 where food_id = 1 ;
4)查看整个数据表
a.select*fromuser_table;
说明:其中user_table是数据表名字。
5)退出
a..quit
1)打开数据库(可以先用基本sql命令建好数据库,如不存在系统会默认创建)
intsqlite3_open( 文件名,sqlite3 **);
int sqlite3_exec(sqlite3*,const char *sql,sqlite3_callback,
void *,char**errmsg);
3)回调函数(也可以不用)
typedef int (*sqlite3_callback)(void*,int,char**,char**);
5)编译
Gcc -o main main.c -lsqlite3
说明:main是你要生成的执行文件名称;main.c是源文件,这里可以多加 上其他源文件,若是一个工程则需写Makefile;-lsqlite3是第三方库
1)intsqlite3_open(文件名,sqlite3 **);
b.参数说明:
第一个参数:是你要打开的数据库名称,如test.db3,如果该数据库不存在,则系统会自动创建它。
第二个参数:是关键数据结构指针的地址,所以这里提到一个关键数据结构指针sqlite3 *类型(如:sqlite *db),从数据库打开开始,sqlite就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型,这个类型的变量其实就代表了你要操作的数据库。
2)intsqlite3_exec(sqlite3*,char**errmsg);
b.参数说明:
第一个参数:就是前面提到的关键数据结构指针db;
第二个参数:是要执行的一条sql命令语句;
第三个参数:是一个回调函数,当这条执行语句被执行后,函数会去执行这个回调函数。如果不需要调用回调函数,则这个位置可以填NULL,比如insert插入操作,delete删除操作,就没有必要使用回调。而当你做查询操作时,就要使用回调,因为sqlite3把数据查出来后,得通过回调告诉你查出了什么数据。
第四个参数:你想传递给回调函数的变量,再将这个变量强制转换成void *,如果不需要传递变量给回调函数,可以填NULL。
第五个参数:填的是char *变量的地址,这个变量是用来接收错误信息的。
3)static int sqlite3_callback(void*,char**);
a.功能说明:每查到一条记录,就调用一次这个回调函数,通过这个函数可以接收到所查询的数据;
b.参数说明:
第一个参数:这就是sqlite3_exec执行函数所传递的void *参数(这里需要强制类型转换成void *才能使用)。
第二个参数:查询到的数据表的列数。
第三个参数:保存查询到的数据表数据。
第四个参数:保存数据表中数据对应的名称,即字段名字。
4)intsqlite3_close(sqlite3 *);
b.参数说明:直接将前面我们提到的代表数据库的关键数据结构指针db填进去即可关闭掉对应的数据库。
Ø 如何用程序来实现更改数据表中的数据
char src_update[50];
int food_num,food_id;
//将两变量放到字符串中,再放到src_update[]这个数组中。
sprintf(src_update,"update menu_table set food_num =%d where (food_id = %d)",food_num,food_id));
//执行上面字符数组src_update中的命令语句,且不调用回调函数,不传参
ret= sqlite3_exec(db,src_update,NULL,&zerrmsg);
if(ret != sqlITE_OK ) //判断执行函数是否调用成功
{
sqlite3_free(zerrmsg);
fprintf(stderr,"sql error: %s\n",zerrmsg); //打印出错误信息
}
说明:其他sql命令语句在程序中的函数实现方法,都可参照上面更改数据表中的数据这模板,调用方法基本相同,只需将你要实现的sql命令放到字符数组src_update中,再调用执行函数即可。
Ø 基本流程简单示例:
#include<stdio.h>
#include<sqlite3.h> //必须包含的,这里面定义了一些我们需要的数据类型
#include<stdlib.h>
#include<fcntl.h>
//基本变量定义
char *zerrmsg = 0;
char *src;
charserver_buf[BUFSIZ];
int rc;
sqlite3 *db;
int main(int argc,char *argv[])
{
rc =sqlite3_open(argv[1],&db); //打开数据库
if(rc) //判断打开是否错误
{
fprintf(stderr,"Can't opendatabase: %s\n",sqlite3_errmsg(db));
sqlite3_close(db);
return(1);
}
src ="select *from menu_table"; //想要执行的sql命令语句
rc =sqlite3_exec(db,src,callback,(void *)arg,&zerrmsg); //调用执行函数
if(rc != sqlITE_OK ) //判断执行函数是否调用成功
{
sqlite3_free(zerrmsg);
fprintf(stderr,"sql error:%s\n",zerrmsg); //错误信息打印
}
return0;
}
//其中argc为列数,这个函数是一行读取完后回到该回调函数最开始位 置,接着再读取第二行...一直到读完整个表后退出。
static intcallback(void *arg,int argc,char *argv[],char **char_name)
{
int i;
for(i = 0; i < argc; i++)
{ //以下只是取到排版作用,没不要深究
if((i% 3) != 0)
sprintf(server_buf,"%s = %s\t",char_name[i],argv[i]);
else
sprintf(server_buf,"%s = %s\n",argv[i]);
if(i == 0)
sprintf(server_buf,argv[i]);
write((int)arg,server_buf,sizeof(server_buf));
}
return 0;
}
Ø附录:
.tables ?PATTERN? 列出?PATTERN?匹配的表名
.import FILE TABLE 将文件中的数据导入的文件中
.output stdout 将输出打印到屏幕
.mode MODE ?TABLE? 设置数据输出模式(csv,html,tcl…
.nullvalue STRING 用指定的串代替输出的NULL串
.schema ?TABLE? 打印创建数据库表的sql语句
.separator STRING 用指定的字符串代替字段分隔符
.show 打印所有sqlite环境变量的设置
.quit 退出命令行接口
2)sqlite常量的定义
const
sqlITE_OK = 0;返回成功
sqlITE_ERROR = 1; sql错误或错误的数据库
sqlITE_INTERNAL = 2; An internal logic error in sqlite
sqlITE_PERM = 3;拒绝访问
sqlITE_NOMEM = 7;内存分配失败
sqlITE_READONLY = 8;试图对一个只读数据库进行写操作
sqlITE_INTERRUPT = 9;由sqlite_interrupt()结束操作
sqlITE_CORRUPT = 11; 数据库磁盘镜像畸形
sqlITE_NOTFOUND = 12; (InternalOnly)表或记录不存在
sqlITE_CANTOPEN = 14; 不能打开数据库文件
sqlITE_PROTOCOL = 15; 数据库锁定协议错误
sqlITE_EMPTY = 16; (InternalOnly)数据库表为空
sqlITE_TOOBIG = 18; 对一个表数据行过多
sqlITE_CONSTRAINT = 19; 由于约束冲突而中止
sqlITE_MISMATCH = 20; 数据类型不匹配
sqlITE_NOLFS = 22; 使用主机操作系统不支持的特性
sqlITE_AUTH = 23; 非法授权
原文链接:https://www.f2er.com/sqlite/201388.html