zoukankan      html  css  js  c++  java
  • 嵌入式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;
    }

        

  • 相关阅读:
    抓取到的网页写入数据库后是乱码的解决方法
    关于SecureCRT v7.0.2.418 安装、破解和修改
    负数的除法和取模运算(Python 2.7和C的比较)
    单模式匹配匹配算法
    Python解析网页工具:PyQuery
    asp.net json,对象,字符串的相互转换
    asp.net 后台 get,post请求
    查看局域网内所有IP
    MSSql性能优化
    js中对象复制以及apply方法的使用
  • 原文地址:https://www.cnblogs.com/FREMONT/p/9491961.html
Copyright © 2011-2022 走看看