嵌入式 sqlite3 相关使用

1.什么是sqlite3数据库

SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。就像其他数据库,SQLite 引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。此外,安装sqlite3也极为简单,其大小只有250KB左右;

2.linux安装sqlite3数据库

2.1本地安装

需要在官网下载文件后安装;

sudo  dpkg -i *.deb

2.2在线安装(建议)

sudo apt-get install sqlite3

安装完成后,命令行输入 sqlite3,如果是下面内容,则表示安装成功:
在这里插入图片描述

3.sqlite3基本语句

sqlite3 的命令分为两种,一种是系统命令,另一种是sql语句;
命令必须以 . 打头,sql语句必须以 ; 结尾.

3.1系统命令

在linux命令行模式输入 sqlite3 [数据库名称] 即可创建或打开一个数据库;
(1) .help
用来查看帮助信息;

(2) .quit.exit
退出 sqlite3 编辑模式;

(3) .shema
查看已创建表的表头

(4) .table
查看已创建表的表名;

(5) .database
查看数据库相关信息,例如保存路径,大小等;

3.2 sql的几个基本语句

  • 创建一个新表stu

create table stu ( id Integer , name char , score float );

这样,我们就创建了一张名为 stu 的新表,表头有三个数据,分别是整型的学号,字符串类型的姓名以及浮点型的分数;

  • 向表中插入数据

insert into stu values( 1001 , ’ wuwukai ’ , 88.7 );

系统会根据顺序依次插入对应的位置;

  • 插入部分数据

insert into stu ( id , name)values( 1002,‘PDD’); //这里栏数据只有id和姓名而没有分数

  • 查看表中所有数据

select * from stu;

  • 按条件查找表中的数据

select * from stu where name = ‘wuwukai’; //查询姓名为‘wuwukai’的学生信息;
select * from stu where name = ‘wuwukai’ and score = 88.7; //查询同时满足条件的学生信息;
select * from stu where name = ‘wuwukai’ or score = 88.7; //查询满足任意条件的学生信息;

  • 删除一条记录

delete from stu where name = ‘wuwukai’; //删除表中name为wuwukai的这一条记录;

  • 更新一条记录

update stu set name = ‘wuwukai’ where id = 1001;
update stu set name = ‘wuwukai’ , score = 88 where id = 1001;

  • 添加一列(加一个表头信息)

alter table stu add column address char;

  • 删除一列
    sqlite3 不支持直接删除一列,我们可以使用三步来完成,假设删除分数这一列;

1.create table stu1 as select id , name from stu; //创建一张新表,这个表保存了stu表的id和名字
2.drop table stu; //删除原表;
3.alter table stu1 rename to stu; //将新表名改为旧表名;

4.sqlite3数据库的API操作

1. sqlite3_open()

int sqlite3_open(const char *filename, sqlite3 **ppDb);

函数功能:创建新的或打开已创建的数据库;
参数:filename是该数据库的名称,同时可以指定保存路径,默认为当前路径( . / );第二个参数是用来操作这个数据库的一个句柄,是一个二级指针;
返回值:成功返回 SQLITE_OK,失败返回错误码;

2.sqlite3_errmsg();

const char *sqlite3_errmsg(sqlite3*ppDb);

功能:获取当前的错误信息;

3. sqlite3_exec()

int sqlite3_exec(
   sqlite3* ppDb,                             /* 操作数据库所用的句柄 */
   const char *sql,                           /* sqlite3 语句 */
   int (*callback)(void*,int,char**,char**),  /* 回调函数 */
   void *,                                    /* 传递给回调函数的参数 */
   char **errmsg                              /* 错误信息保存处 */
 );

功能:该函数连接了sqlite3 与 c程序,它使用第一个参数指定的数据库,利用第二个参数的sqlite3 语句执行,如果出错,出错信息将会保存在最后一个参数中,回调函数只在sqlite3语句为查询时生效;

回调函数

int callback( 
  void*      para,   //sqlite3_exec()语句所传参数;
  int        argc,  //表中记录的条数;
  char**     argv,  //这是一个保存了每一条记录的各个信息的指针的数组;
  char**     head_name   //这是一个保存了表头信息的指针的数组
); 

当我们使用sqlite3_exec()函数并且所使用的是查询语句后,查询的结果将会传给回调函数,我们通过操作回调函数的参数,就可以得到我们想要的数据;

5.代码

#include <stdio.h>
#include <stdlib.h>
#include <sqlite3.h>

#define PTAH_and_NAME "./student.db"

int do_insert(sqlite3 *db)
{
    char      sql[128] = {0};
    int       id;
    char      name[32] = {0};
    int       score;
    char     *errmsg;

    printf("Input id:");
    scanf("%d",&id);
    getchar();

    printf("Input name:");
    scanf("%s",name);
    getchar();
   
    printf("Input score:");
    scanf("%d",&score);
    getchar();
 
    sprintf(sql,"insert into stu values(%d,'%s',%d);",id,name,score);
     
    if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
    {
        printf("%s\n",errmsg);
    }
    
    else 
    {
        printf("Insert ok.\n");
    }

    return 0;

}

int do_delete(sqlite3 *db)
{
    int id;
    char sql[128] = {0};
    char *errmsg;

    printf("Input the id you will delete:\n");
    scanf("%d",&id);
    getchar();

    sprintf(sql,"delete from stu where id = %d;",id);

    if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
    {
        printf("%s\n",errmsg);
    }

    return 0;

}

int callback(void *data,int argc,char **argv,char **headname)
{
    int i;
    for(i = 0;i < argc;i++)
    {
        printf("%s = %s\n",headname[i],argv[i]);
    }

    printf("\n");

    return 0;
    
}

int do_query(sqlite3 *db)
{
    char *errmsg;
    char sql[128] = "select * from stu;";

    if(sqlite3_exec(db,sql,callback,NULL,&errmsg) != SQLITE_OK)
    {
        printf("%s\n",errmsg);
    }

    return 0;
}

int do_update(sqlite3 *db)
{
    char *errmsg;
    char sql[128] = {};

    printf("Input the sqlite3 command you want exec:\n");
    fgets(sql,sizeof(sql),stdin);

    if(sqlite3_exec(db,sql,NULL,NULL,&errmsg) != SQLITE_OK)
    {
        printf("%s\n",errmsg);
    }

    return 0;
}


int main(int argc, char *argv[])
{
    int      ch;
    sqlite3  *db;
    char     *errmsg;

    if(sqlite3_open(PTAH_and_NAME,&db) != SQLITE_OK)
    {
        printf("sqlite3_open failure:%s\n",sqlite3_errmsg(db));
        return -1;
    }

    else 
    {
        printf("Open or create student.db ok\n");
    }

    if(sqlite3_exec(db,"create table stu (id Integer,name char,score Integer);",NULL,NULL,&errmsg) != SQLITE_OK)
    {
        printf("%s\n",errmsg);
    }

    else 
    {
        printf("create table or open success.\n");
    }
    
    while(1)
    {
        printf("**************************************************\n");
        printf("    1:insert 2:delete 3:query 4:update 5:quit.\n");
        printf("**************************************************\n");
        printf("Input option:\n");

        scanf("%d",&ch);
        getchar();

        switch(ch)
        {
            case 1:
                do_insert(db);
                break;

            case 2:
                do_delete(db);
                break;

            case 3:
                do_query(db);
                break;
            
            case 4:
                do_update(db);
                break;

            case 5:
                sqlite3_close(db);
                exit(0);

            default:
                printf("Error input\n");
                
        }
    }

        

    
    return 0;
}
发布了18 篇原创文章 · 获赞 37 · 访问量 4996

猜你喜欢

转载自blog.csdn.net/weixin_45121946/article/details/105079537