嵌入式sqlite3数据库学习笔记

嵌入式sqlite3

一、sqlite3安装

  1.本地安装

   下载安装包,官网地址:http://www.sqlite.org/download.html

      

    步骤如下:   

$tar xvfz sqlite-autoconf-3071502.tar.gz
$cd sqlite-autoconf-3071502
$./configure --prefix=/usr/local  //指定安装目录
$make
$make instal  

  2.在线安装

    sudo apt-get install sqlite3

    查看是否安装完成 sqlite3

    在终端输入sqlite3是否显示如下内容:

   SQLite version 3.11.0 2016-02-15 17:29:24

    Enter ".help" for usage hints.

     Connected to a transient in-memory database.
          Use ".open FILENAME" to reopen on a persistent database.
          sqlite>

    使用中编译时出现: fatal error: sqlite3.h: 没有那个文件或目录

    描述:找不到头文件 
    原因:系统没有安装函数库 

    解决办法:sudo apt-get install libsqlite3-dev

二、sqlite3数据库命令(重点)

  1、系统命令,都以'.'开头

     sqlite> help 打开帮助手册查看各种系统命令

   .exit
    .quit
    .table 查看表
    .schema 查看表的结构

  2、sql语句,都以‘;’结尾

  1.打开(创建)一个数据库(必须先创建一个数据库才能在数据库中建立表格)

    sqlite3 xxx.db

  2-- 在数据库中创建一张表

    create table stuinfo(id integer, name text, age integer, score float);

  3-- 插入一条记录
    insert into stuinfo values(1001, 'zhangsan', 18, 80);
    insert into stuinfo (id, name, score) values(1002, 'lisi', 90);

  4-- 查看数据库记录
    select * from stuinfo;(*通配表示所有数据)
    select name,score from stuinfo;
    查询指定的字段

    where表示选取,and表示与(同时满足),or表示或

    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 * from stuinfo where score >= 85 and score < 90;

  5-- 删除一条记录
     delete from stuinfo where id=1003 and name='zhangsan';

  6-- 更新一条记录
    update stuinfo set age=20 where id=1003;
    update stuinfo set age=30, score = 82 where id=1003;

  7-- 删除一张表

    删除整张表而不是某一条记录与delete区分
    drop table stuinfo;

  8-- 增加一列
    alter table stuinfo add column sex char;

  9-- 删除一列

    因sqlite没有直接删除一列的功能,所以分三步,先新建一个数据库复制原来的数据库

     (除去想要删除的那一列不复制)

     然后删除原来的数据库,再把新建的数据库改名为原来的数据库,达到删除一列的目的。
    create table stu as select id, name, score from stuinfo; /*创建新表*/
    drop table stuinfo;/*删除原表*/
    alter table stu rename to stuinfo;/*改名*/

  数据库设置主键:

  create table info(id integer primary key autoincrement, name vchar);

  主键就是限制资料不重复的字段﹐设置为主键的字段(可多个字段一起做主键)﹐设了主键就限制了资料的唯一性。

  例如在人事资料中有一个身份征号的字段﹐这个就可设为主键(因为身份征号不会重复),但姓名就 不可以,因为姓名可以重复。

  另外设置了主键有利于提高数据的检索速度﹐也保证数据的准确性

    3.sqlite3 数据库 C语言 API 

  1)创建(打开)数据库函数

        int sqlite3_open(

      const char *filename, /* Database filename (UTF-8) */(字符串或者数组名数据库的名字xxx.db格式

      sqlite3  **ppDb            /* OUT: SQLite db handle */ (sqlite型的二级指针,传入sqlite *类型的地址) 
        );

      功能:打开数据库

      参数:filename 数据库名称
    ppdb 数据库句柄
      返回值:成功为0 (SQLITE_OK) ,出错 错误码

  2)关闭数据库函数

   int sqlite3_close(sqlite3* db);

   功能:关闭数据库
   参数:
     返回值:成功为0 SQLITE_OK ,出错 错误码

  3)打印错误信息函数

     const char *sqlite3_errmsg(sqlite3*db);

     功能:通过db指针,得到错误信息的描述,
     返回值:错误信息首地址(用printf打印,类似于strerror函数)

   4)数据库操作函数(重点)

  Int sqlite3_exec(sqlite3 *db, const char *sql, sqlite3_callback callback, void *, char **errmsg);
  功能:执行SQL操作
  db:数据库句柄
  sql:SQL语句(操作命令的字符串)
  callback:回调函数(在查询功能是才调用回调函数,其他功能直接传NULL)

  arg :     为回调函数传递参数

  errmsg:错误信息指针的地址
  返回值:成功返回0,失败返回错误码

  回调函数(查询使用):

   Typedef int (*sqlite3_callback)(void *arg, int n, char **f_value, char **f_name);

   功能:查询语句执行之后,会回调此函数,每找到一条记录自动执行一次回调函数

  参数:arg 接收sqlite3_exec 传递来的参数,函数指针类型(函数名)
  ncolumns 列数
  f_value 列的值得地址,f_value[0]~f_value[f_ncolumns
  f_name 列的名称
  返回值:0,

  5)查询(查找)数据库的另一种方法

  不使用回调函数执行SQL语句

  int sqlite3_get_table(sqlite3 *db, const char *sql, char ***resultp, int*nrow, int *ncolumn, char **errmsg);
  功能:执行SQL操作
  db:数据库句柄
  sql:SQL语句
  resultp:用来指向sql执行结果的指针(类似于指针数组)
  nrow:满足条件的记录的数目(行数,不包括标题栏)
  ncolumn:每条记录包含的字段数目(列数)
  errmsg:错误信息指针的地址
  返回值:成功返回0,失败返回错误码

  示例代码:创建一个数据库,其中保存学生信息(学号id,姓名,年龄,性别,分数等等)  

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

#define  DATABASE  "student.db"
#define  N  128

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

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

    printf("Input name:");
    scanf("%s", name);
    getchar();

    printf("Input sex:");
    scanf("%c", &sex);

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

    sprintf(sql, "insert into student values(%d, '%s', '%c', %d)", id, name, sex, score);

    if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s
", errmsg);
    }
    else
    {
        printf("Insert done.
");
    }

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

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

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

    if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s
", errmsg);
    }
    else
    {
        printf("Delete done.
");
    }

    return 0;
}
int do_update(sqlite3 *db)
{
    int id;
    char sql[N] = {};
    int score;
    char *errmsg;
    
    printf("Input id:");
    scanf("%d", &id);
    getchar();
    
    printf("Update score:");
    scanf("%d",&score);
    getchar();
        
    sprintf(sql, "update student set score =%d where id=%d",score,id);

    if(sqlite3_exec(db, sql, NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s
", errmsg);
    }
    else
    {
        printf("update done.
");
    }

    return 0;
}

/*f_value f_name 传出参数,肯定定义在了数据库的其他地方*/
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]);
    }

    printf("
++++++++++++++++++++++");
    putchar(10);

    return 0;
}

int do_query(sqlite3 *db)
{
    char *errmsg;
    //char sql[N] = "select count(*) from stu where name='zhangsan';";
    char sql[N];
    
    sprintf(sql,"select *from student");
    
    if(sqlite3_exec(db, sql, callback,NULL,&errmsg) != SQLITE_OK)
    {
        printf("%s", errmsg);
    }
    else
    {
        printf("select done.
");
    }
    return 0;
}

int do_query1(sqlite3 *db)
{
    char *errmsg;
    char ** resultp;
    int nrow;
    int ncolumn;

    if(sqlite3_get_table(db, "select * from student", &resultp, &nrow, &ncolumn, &errmsg) != SQLITE_OK)
    {
        printf("%s
", errmsg);
        return -1;
    }
    else
    {
        printf("query done.
");
    }

    int i = 0;
    int j = 0;
    int index = ncolumn;//跳过标题直接从数据开始打印

    for(j = 0; j < ncolumn; j++)
    {
        printf("%-10s ", resultp[j]);
    }
    putchar(10);

    for(i = 0; i < nrow; i++)
    {
        for(j = 0; j < ncolumn; j++)
        {
            printf("%-10s ", resultp[index++]);
        }
        putchar(10);
    }

return 0;
}

int main(int argc, const char *argv[])
{
    sqlite3 *db;
    char *errmsg;
    int n;
    
    if(sqlite3_open(DATABASE, &db) != SQLITE_OK)
    {
        printf("%s
", sqlite3_errmsg(db));
        return -1;
    }
    else
    {
        printf("open DATABASE success.
");
    }

    if(sqlite3_exec(db, "create table if not exists student(id int, name char , sex char , score int);",
                NULL, NULL, &errmsg) != SQLITE_OK)
    {
        printf("%s
", errmsg);
    }
    else
    {
        printf("Create or open table success.
");
    }

    while(1)
    {
        printf("********************************************
");
        printf("1: insert  2:query  3:delete 4:update 5:quit
");
        printf("********************************************
");
        printf("Please select:");
        scanf("%d", &n);

        switch(n)
        {
            case 1:
                do_insert(db);
                break;
            case 2:
                do_query(db);
                //do_query1(db);
                break;
            case 3:
                do_delete(db);
                break;
            case 4:
                do_update(db);
                break;
            case 5:
                printf("main exit.
");
                sqlite3_close(db);
                exit(0);
                break;
            default :
                printf("Invalid data n.
");
        }

    }
    return 0;
}

    

原文地址:https://www.cnblogs.com/FREMONT/p/9491961.html