1.
数组、链表、变量-----》内存:程序运行结束、掉电数据丢失
文件----------------------》硬盘:程序运行结束、掉电数据不丢失
数据库: 专业存储数据、大量数据-----》硬盘
 sqlite相关的命令
       .tables                         查看数据库中的表
       .headers on/off            开启或者关闭表头
       .mode column              列对齐
       .width 列宽1 列宽2      设置每一列的列宽
       .schema  表名              查看表的结构
sqlite的SQL语句
         每个sql语句后面必须要有一个;
         INTEGER : 整形
         REAL: 浮点型
         TEXT:文本类型,字符串
         NULL : 空
        1.创建表
           create table 表名(列名1 数据类型 ,列名2 数据类型, 类名3 数据类型) ;
       2. 插入数据
            insert into 表名 values(值1, 值2, 值3);
       3. 查询
           select 列名1,列名2  from 表名;
           select *  from 表名;
     条件查找:
           select *  from 表名 where 列 关系运算符 (> < = != >= <= and or);
like : 模糊匹配
         % 可以通配多个字符
         _  只能通配一个字符
        升序排列
         select * from 表名 order by 列名 ASC;
         降序排列:
         select * from 表名 order by 列名 DESC;
     4. 删除一行
         delect from 表名 where 列名 关系运算符 值;
     5. 删除一张表
         drop 表名;      
    6. 修改    
         update 表名 set 列名=新值 where 列=值;
    7. 设置主键值自动增长列
         1. 主键值自动增长列的数据类型必须是INTEGER
         2. 类名 INTEGER PRIMARY KEY AUTOINCREMENT,
    8 .多表联查
          内连接   INNER JOIN
        
          外连接   LEFT OUTER JOIN         
  
3. sqlite3提供的c/c++ API接口
     int sqlite3_open(
   const char *filename,   /* Database filename (UTF-8) */
   sqlite3 **ppDb          /* OUT: SQLite db handle */
 );
     功能:打开数据库,如果不存在,则创建
     参数:
                filename : 数据库名称
                ppDb   :保存数据库句柄的地址   
     返回值:
                成功:SQLITE_OK
                失败:错误码  
int sqlite3_exec(
   sqlite3*pdb,                                  /* An open database */
   const char *sql,                           /* SQL to be evaluated */
   int (*callback)(void*,int,char**,char**),  /* Callback function */
   void *arg,                                    /* 1st argument to callback */
   char **errmsg                              /* Error msg written here */
 );
 功能:执行sql语句
 参数:
           pdb : 数据库句柄
          sql : 要执行的sql语句的首地址
         callback : 当执行select语句时,使用到
         arg:当执行select语句时,使用到,传递给回调函数的第一个参数
        errmsg :存储错误信息的地址                             
 返回值:
               成功:SQLITE_OK
                失败:错误码  
#include<stdio.h>
#include<sqlite3.h>
int main(int argc,char *argv[])
{sqlite3 *pdb;int ret = sqlite3_open("./sth.db",&pdb);if(ret != SQLITE_OK){fprintf(stderr,"sqlite3_open fail:%s\n",sqlite3_errmsg(pdb));return -1;}char *sql = "create table if not exists class4(id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT,score REAL);";ret = sqlite3_exec(pdb,sql,NULL,NULL,NULL);if(ret != SQLITE_OK){fprintf(stderr,"sqlite3_exec fail:%s\n",sqlite3_errmsg(pdb));sqlite3_close(pdb);return -1;}char *sql1 = "insert into class4 values(NULL,\"zhangsan\",99);";char *sql2 = "insert into class4 values(NULL,\"lisi\",89);";char *sql3 = "insert into class4 values(NULL,\"wangwu\",67);";sqlite3_exec(pdb,sql1,NULL,NULL,NULL);sqlite3_exec(pdb,sql2,NULL,NULL,NULL);sqlite3_exec(pdb,sql3,NULL,NULL,NULL);sqlite3_close(pdb);return 0;
}int (*callback)(void*,int column_cnt,char**column_value,char**column_name),
int callback(void* arg, int , char **, char **);
 功能:在使用sqlite3_exec执行select语句时, 每查找到一条数据,则调用一次回调
 参数:
          arg : sqlite3_exec传递的第4个参数
          column_cnt: 查找到的数据的列数
          column_value:  查找到的一行数据的每一列值的地址的集合
          column_name:查找到的一行数据的每一列列名的地址的集合
 返回值:
           成功 :1     失败:0
注意:1.每找到一行,回调被触发一次
            2. 回调函数必须返回0
#include<stdio.h>
#include<sqlite3.h>
int flag = 0;
int callback(void *arg,int column_cnt,char **column_value,char **column_name)
{if(0 == flag){for(int i = 0;i < column_cnt;++i){printf("%s ",*(column_name + i));}printf("\n");flag = 1;}for(int i = 0;i < column_cnt;++i){printf("%s ",*(column_value + i));}printf("\n");return 0;
}
int callback1(void *arg,int column_cnt,char **column_value,char **column_name)
{printf("%s\n",*column_value);return 0;
}
int main(int argc,char *argv[])
{sqlite3 *pdb;int ret = sqlite3_open("./sth.db",&pdb);if(ret != SQLITE_OK){fprintf(stderr,"sqlite3_open fail:%s\n",sqlite3_errmsg(pdb));return -1;}char *sql = "select name from class4;";ret = sqlite3_exec(pdb,sql,callback1,NULL,NULL);if(ret != SQLITE_OK){fprintf(stderr,"sqlite3_exec fail:%s\n",sqlite3_errmsg(pdb));sqlite3_close(pdb);return -1;}sqlite3_close(pdb);return 0;
}