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;
    }

        

  • 相关阅读:
    Android开发之Sqlite的使用
    ZOJ 3607 Lazier Salesgirl
    ZOJ 3769 Diablo III
    ZOJ 2856 Happy Life
    Ural 1119 Metro
    Ural 1146 Maximum Sum
    HDU 1003 Max Sum
    HDU 1160 FatMouse's Speed
    Ural 1073 Square Country
    Ural 1260 Nudnik Photographer
  • 原文地址:https://www.cnblogs.com/FREMONT/p/9491961.html
Copyright © 2011-2022 走看看