sqlite数据库入门支招--助你少走弯路

来源:互联网 发布:建筑设计院软件 编辑:程序博客网 时间:2024/04/30 07:06

Ø 前言:

sqlite是目前最流行的开源嵌入式数据库,支持标准SQL语法、事务、数据表和索引等,还具有平台无缝移植性。大家都知道嵌入式系统要求实时性比较强,而且本身内存比较有限,放不了那些大型的本地数据库,所以这种轻量级的高速的可靠的数据库也就受到欢迎。最近自学了这数据库,根据自己所走的弯路,花了大半天总结了这篇入门文档,希望对想学的人有点帮助,当然这里讲的都是最基础最简单的,只能帮助你入门,如果要深究,还有很多的东西要学。

 

Ø 首先安装步骤:

1)       在shell命令窗口敲入:sudo apt-get install sqlite sqlite3

2)       在shell命令窗口敲入:sudo apt-get install libsqlite3-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 www.baidu.com

若显示: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    //重启网络

 

Ø sqlite库的一些基本SQL命令

1)       sqlite库的建立

a.       在shell命令窗口敲入:sqlite3 test.db3

说明:其中test.db3是你要建立的数据库名字

2)       创建一个数据表

a.   敲入:create table user_table(food_id,food_name,food_price,...);

说明:其中user_table是你要建的数据表的名字,如可以用menu_table, 其中food_id,food_name,food_price,...是你要建立的表的各列字段名称。

1)       插入一条记录

a.       insert into user_table(food_id,food_name,food_price,...) values(1,‘菜名’,12,...);

b.       例如:

insert into menu_table(food_id,food_name,food_price) values(1,‘四 季豆肉丝’,11);

2)       删除一条记录

a.  delete  from user_table  where  condition;

说明:其中user_table是所建立的数据表的名字,condition是指定的条件,  这样能指定删除哪一条记录,不写的话是删除整个表,需谨慎!

b.       例如:delete  from  menu_table where  food_id = 1;

3)       修改一条记录

a.  update  user_table set  update_list  where condition;

说明:其中只有user_table,update_list,condition是变动的,user_table是所建 立的数据表 的名字,update_list是所要更改的数据列表,condition是指定的   条件,这样能指定更改那一条记录,否则将更改整个表。

b.  例如:update  menu_table  set food_id = 2  where  food_id = 1 ;

4)       查看整个数据表

a.       select * from user_table;

说明:其中user_table是数据表名字。

5)       退出

a.       .quit

 

Ø sqlite库的基本操作流程(即用程序操作数据库的流程)

1)       打开数据库(可以先用基本SQL命令建好数据库,如不存在系统会默认创建)

intsqlite3_open( 文件名, sqlite3 **);

2)       执行函数(查询、插入、删除、更改等操作)

int sqlite3_exec(sqlite3*,const char *sql, sqlite3_callback,

void *, char**errmsg);

3)       回调函数(也可以不用)

typedef int (*sqlite3_callback)(void*,int,char**, char**);

4)  关闭数据库

int sqlite3_close(sqlite3 *);

5)  编译

Gcc -o main main.c -lsqlite3

说明:main是你要生成的执行文件名称;main.c是源文件,这里可以多加  上其他源文件,若是一个工程则需写Makefile;-lsqlite3是第三方库

 

Ø  sqlite库的一些常用函数介绍

1)       intsqlite3_open(文件名, sqlite3 **);

a.  功能说明:打开一个数据库。

b.  参数说明:

第一个参数:是你要打开的数据库名称,如test.db3,如果该数据库不存在,则系统会自动创建它。

第二个参数:是关键数据结构指针的地址,所以这里提到一个关键数据结构指针sqlite3 *类型(如:sqlite *db),从数据库打开开始,sqlite就要为这个类型准备好内存,直到数据库关闭,整个过程都需要用到这个类型,这个类型的变量其实就代表了你要操作的数据库。

2)  intsqlite3_exec(sqlite3*, const char *sql, sqlite3_callback,

void *, char**errmsg);

a.  功能说明:执行一条SQL命令的函数。

b.  参数说明:

第一个参数:就是前面提到的关键数据结构指针db

第二个参数:是要执行的一条SQL命令语句;

第三个参数:是一个回调函数,当这条执行语句被执行后,函数会去执行这个回调函数。如果不需要调用回调函数,则这个位置可以填NULL,比如insert插入操作,delete删除操作,就没有必要使用回调。而当你做查询操作时,就要使用回调,因为sqlite3把数据查出来后,得通过回调告诉你查出了什么数据。

第四个参数:你想传递给回调函数的变量,再将这个变量强制转换成void *,如果不需要传递变量给回调函数,可以填NULL。

第五个参数:填的是char *变量的地址,这个变量是用来接收错误信息的。

3)  static int sqlite3_callback(void*, int, char**, char**);

a.  功能说明:每查到一条记录,就调用一次这个回调函数,通过这个函数可以接收到所查询的数据;

b.  参数说明:

第一个参数:这就是sqlite3_exec执行函数所传递的void *参数(这里需要强制类型转换成void *才能使用)。

第二个参数:查询到的数据表的列数。

第三个参数:保存查询到的数据表数据。

第四个参数:保存数据表中数据对应的名称,即字段名字。

4)  intsqlite3_close(sqlite3 *);

a.  功能说明:关闭数据库。

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, 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);  //错误信息打印

       }

 

sqlite3_close(db);                                                   //关闭数据库

 

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", char_name[i], argv[i]);        

              if(i == 0)

                     sprintf(server_buf,"%s = %s\t", char_name[i], argv[i]);  

 

              write((int)arg, server_buf,sizeof(server_buf));

       }

 

       return 0;

}

Ø 附录:

1) SQL命令功能

.databases              列出数据库文件名

.tables ?PATTERN?        列出?PATTERN?匹配的表名

.import FILE TABLE       将文件中的数据导入的文件中

.dump ?TABLE?            生成形成数据库表的SQL脚本

.output FILENAME         将输出导入到指定的文件中

.output stdout           将输出打印到屏幕

.mode MODE ?TABLE?       设置数据输出模式(csv,html,tcl…

.nullvalue STRING        用指定的串代替输出的NULL串

.read FILENAME           执行指定文件中的SQL语句

.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_ABORT        = 4;  回调函数请求中断

    SQLITE_BUSY         = 5;  数据库文件被锁

    SQLITE_LOCKED       = 6;  数据库中的一个表被锁

    SQLITE_NOMEM        = 7;  内存分配失败

    SQLITE_READONLY     = 8;  试图对一个只读数据库进行写操作

    SQLITE_INTERRUPT    = 9;  由sqlite_interrupt()结束操作

    SQLITE_IOERR        = 10;  磁盘I/O发生错误

    SQLITE_CORRUPT      = 11;  数据库磁盘镜像畸形

       SQLITE_NOTFOUND     = 12;   (InternalOnly)表或记录不存在

       SQLITE_FULL         = 13;  数据库满插入失败

       SQLITE_CANTOPEN     = 14;  不能打开数据库文件

       SQLITE_PROTOCOL     = 15;  数据库锁定协议错误

       SQLITE_EMPTY        = 16;   (InternalOnly)数据库表为空

       SQLITE_SCHEMA       = 17;  数据库模式改变

       SQLITE_TOOBIG       = 18;  对一个表数据行过多

       SQLITE_CONSTRAINT   = 19;  由于约束冲突而中止

       SQLITE_MISMATCH     = 20;  数据类型不匹配

       SQLITE_MISUSE       = 21;  数据库错误使用

       SQLITE_NOLFS        = 22;  使用主机操作系统不支持的特性

       SQLITE_AUTH         = 23;  非法授权

       SQLITE_FORMAT       = 24;  辅助数据库格式错误

       SQLITE_NOTADB       = 26;  打开的不是一个数据库文件

原创粉丝点击