表的创建、修改、删除
create table 表名(字段名 字段类型 [约束],...);
alter table 表名 {rename to 新名字 | add column 字段 字段类型};
drop table 表名 ;
DML
记录的增、删、改、查
insert into 表名(字段名,...)values(字段值,...);
insert into 表名 values(字段值,...);

delete from 表名 [where 条件];

update 表名 set 字段=新值 [where 条件];

select * from 表名 [where 条件];

------------------------------------------
sqlite3接口函数

sqlite3 数据库连接对象
sqlite3_stmt 编译后的SQL语句对象
sqlite3_open() 打开或创建一个数据库连接
sqlite3_prepare() 准备SQL语句
sqlite3_bind() 绑定参数
sqlite3_step() 执行准备好的SQL语句
sqlite3_column() 从sqlite3_stmt中取字段值
sqlite3_finalize() 用来释放sqlite3_stmt
sqlite3_close() 关闭数据库
sqlite3_exec() 执行SQL语句

------------------------------------
sqlite3
sqlite3_open
sqlite3_exec
sqlite3_close
sprintf()
-------------
数据库的操作流程:
1.连接数据库
sqlite3 *db; 
2.打开数据库
int sqlite3_open(
const char *filename, /* 数据库名(字符串类型) */
sqlite3 **ppDb /* sqlite3结构二级指针,数据库连接对象 */
);
返回值:成功返回 SQLITE_OK,并且ppDb指向新的数据库连接
其它值表示失败

例:
int res = sqlite3_open("test.db",&db);
if(res != SQLITE_OK)
{
     printf("open db err:%s\n",sqlite3_errmsg(db));
     sqlite3_close(db);
     return -1;
}
3.操作
int sqlite3_exec(
sqlite3*, 打开的数据库 
const char *sql, 要执行的SQL语句(字符串) 
int (*callback)(void*,int,char**,char**), 回调函数
void *, 做为回调函数的第一个参数 
char **errmsg 错误信息写在这里 
)
SQL语句的执行分为两类:
a.没有返回结果的情况,那么就不需要回调函数,给NULL即可
如:create insert update delete...
b.有结果集返回的情况,那么就需要通过回调函数去获取结果集
每查到一条记录调用一次回调函数
如:select

int (*callback)(void* arg,传给回调函数的参数
int column_count,记录的字段(例)个数
char**column_value,字段值(就是个一维数组)
char**column_name)字段名(一维数组)
例:
char* column_name[3] = {"abc","123","hello"};

4.关闭数据库
int sqlite3_close(sqlite3*);

id name age addr

1000 白起 20 CHINA 
1001 李牧 21 CHINA 
1002 王箭 21 CHINA 
1003 廉颇 25 CHINA

gcc sqlite3_exec_select.c 
-I /usr/local/sqlite3/PC/include/ 指明头文件所在目录
-L /usr/local/sqlite3/PC/lib/ 指明库所在目录
-lsqlite3 所用的库的名字

------------------------------------------------------------------------
sqlite3 数据库连接对象
sqlite3_stmt 编译后的SQL语句对象
sqlite3_open() 打开或创建一个数据库连接
sqlite3_prepare() 准备SQL语句
sqlite3_bind() 绑定参数
sqlite3_step() 执行准备好的SQL语句
sqlite3_column() 从sqlite3_stmt中取字段值
sqlite3_finalize() 用来释放sqlite3_stmt
sqlite3_close()

1.打开数据库,建立连接
2.准备SQL语句
(如果SQL语句有可变的参数,那就要绑定值)
int sqlite3_prepare_v2(
sqlite3 *db, /* 数据库连接对象 */
const char *zSql, /* 要执行的SQL语句 */
int nByte, /* SQL语句的长度 */ 可以为负数(-1),自动计算长度
sqlite3_stmt **ppStmt, /* 准备好的SQL语句 */
const char **pzTail /* 指向未执行的SQL语句*/
);
char *zSql = "create table....;intser into...";
char *pzTail = "intser into...";

3.执行
(如果是查询语句,那就需要获取结果集)
int sqlite3_step(sqlite3_stmt*);
执行成功返回SQLITE_DONE
如果有数据返回时,执行成功返回SQLITE_ROW

4.释放sqlite3_stmt对象
int sqlite3_finalize(sqlite3_stmt *pStmt);
5.关闭

-----------------
int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
int sqlite3_bind_double(sqlite3_stmt*, int, double);
int sqlite3_bind_int(sqlite3_stmt*, int, int);
int sqlite3_bind_null(sqlite3_stmt*, int);
int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*));

第一、二个参数和返回值都是相同的:
第一个参数:解析后的语句对象
第二个参数:是要绑定的参数的索引号,从索引值1开始
第三个参数:要给参数绑定的值
第四个参数(如果有):代表第三个参数的绑定值的长度
第五个参数(如果有):是一个指向内存管理的回调函数的指针,一般给0
回调函数:void callback(void*);

练习:
用sqlite3_bind_blob,往数据库里存取图片

const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
int sqlite3_column_bytes(sqlite3_stmt*, int iCol);

double sqlite3_column_double(sqlite3_stmt*, int iCol);
int sqlite3_column_int(sqlite3_stmt*, int iCol);
const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
int sqlite3_column_count(sqlite3_stmt *pStmt);

int sqlite3_column_type(sqlite3_stmt*, int iCol);
返回五个存储类型对应的整数值:
SQLITE_INTEGER 1
SQLITE_FLOAT 2 
SQLITE_TEXT 3
SQLITE_BLOB 4
SQLITE_NULL 5

/*************************************************************************
> File Name: sqlite3_exec.c
> Author: csgec
> Mail: longer.zhou@gmail.com 
> Created Time: Thu 25 Aug 2016 10:07:00 AM CST
************************************************************************/

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

int main()
{
     //1.打开数据库,并建立数据库连接
     sqlite3 *db;
     int res = sqlite3_open("test.db",&db);
     if(res != SQLITE_OK)
     {
          fprintf(stderr,"open err:%s\n",sqlite3_errmsg(db));
          sqlite3_close(db);
          return -1;
     }
printf("打开数据库test.db成功~~\n");

//2.操作数据库,建表,增 删 改 查等操作
char *createSql = "create table if not exists stud(id integer primary key,name text not null,age integer check(age>6),addr text default 'CHINA')";
char *errmsg = NULL;
res = sqlite3_exec(db,createSql,NULL,NULL,&errmsg);
if(res != SQLITE_OK)
{
     fprintf(stderr, "SQL error: %s\n", errmsg);
     sqlite3_free(errmsg);
}
printf("建表 stud 成功~\n");

//3.关闭数据库
     sqlite3_close(db);
     return 0;
}

/*************************************************************************
> File Name: sqlite3_exec_select.c
> Author: csgec
> Mail: longer.zhou@gmail.com 
> Created Time: Thu 25 Aug 2016 10:07:00 AM CST
************************************************************************/

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

int callback(void*arg,int column_count,char **column_value,char** column_name)
{
     printf("字段数:%d\n",column_count);
     int i;
     for(i = 0; i < column_count; i++)
     {
          printf("字段名:%s\t",column_name[i]);
     }
     printf("\n");

for(i = 0; i < column_count; i++)
     {
          printf("%s\t",column_value[i]);
     }
     printf("\n");

return 0;
     }

int main()
{
     //1.打开数据库,并建立数据库连接
     sqlite3 *db;
     int res = sqlite3_open("test.db",&db);
     if(res != SQLITE_OK)
     {
          fprintf(stderr,"open err:%s\n",sqlite3_errmsg(db));
          sqlite3_close(db);
          return -1;
     }
     printf("打开数据库test.db成功~~\n");

//2.操作数据库,建表,增 删 改 查等操作
     // char *createSql = "create table if not exists stud(id integer primary key,name text not null,age integer check(age>6),addr text           default 'CHINA')";

char *selectSql = "select * from stud";
     char *errmsg = NULL;
     res = sqlite3_exec(db,selectSql,callback,NULL,&errmsg);
     if(res != SQLITE_OK)
     {
          fprintf(stderr, "SQL error: %s\n", errmsg);
          sqlite3_free(errmsg);
     }
     printf("建表 stud 成功~\n");

//3.关闭数据库
     sqlite3_close(db);
     return 0;
}

/*************************************************************************
> File Name: sqlite3_prepare.c
> Author: csgec
> Mail: longer.zhou@gmail.com 
> Created Time: Thu 25 Aug 2016 02:23:03 PM CST
************************************************************************/

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
int main()
{
     sqlite3 *db;
     sqlite3_stmt *stmt;
     //1
     int res = sqlite3_open("test.db",&db);
     if(res != SQLITE_OK)
     {
          fprintf(stderr,"open error %s\n",sqlite3_errmsg(db));
          sqlite3_close(db);
          return -1;
     }
     printf("打开数据库test.db成功~\n");

//2.
     int id;
     char name[32] = {0};
     int age;
     char *insertSql = "insert into stud(id,name,age) values(?,?,?);";
     printf("请输入ID:\n");
     scanf("%d",&id);
     printf("请输入姓名:\n");
     scanf("%s",name);
     printf("请输入年龄:\n");
     scanf("%d",&age);
     res = sqlite3_prepare_v2(db,insertSql,strlen(insertSql),&stmt,0);
     if(res != SQLITE_OK)
     {
          printf("sqlite3_prepare_v2 error\n");
          fprintf(stderr,"prepare error %s\n",sqlite3_errmsg(db));
          return -1;
     }
     sqlite3_bind_int(stmt,1,id);
     sqlite3_bind_int(stmt,3,age);
     sqlite3_bind_text(stmt,2,name,strlen(name),0);

//3
     res = sqlite3_step(stmt);
     if(res != SQLITE_DONE)
     {
          printf("sqlite3_step error\n");
          return -1;
     }
     //4
     sqlite3_finalize(stmt);
     sqlite3_close(db);
}

/*************************************************************************
> File Name: sqlite3_prepare_select.c
> Author: csgec
> Mail: longer.zhou@gmail.com 
> Created Time: Thu 25 Aug 2016 02:23:03 PM CST
************************************************************************/

#include<stdio.h>
#include<sqlite3.h>
#include<string.h>
int main()
{
     sqlite3 *db;
     sqlite3_stmt *stmt;
     //1
     int res = sqlite3_open("test.db",&db);
     if(res != SQLITE_OK)
     {
          fprintf(stderr,"open error %s\n",sqlite3_errmsg(db));
          sqlite3_close(db);
          return -1;
     }
     printf("打开数据库test.db成功~\n");

//2.
     char *selectSql = "select * from stud;";
     res = sqlite3_prepare_v2(db,selectSql,strlen(selectSql),&stmt,0);
     if(res != SQLITE_OK)
     {
          printf("sqlite3_prepare_v2 error\n");
          fprintf(stderr,"prepare error %s\n",sqlite3_errmsg(db));
          return -1;
     }

//3
     res = sqlite3_step(stmt);
     /*
     if(res != SQLITE_DONE)
     {
          printf("sqlite3_step error\n");
          return -1;
     }
     */
     int count = sqlite3_column_count(stmt);
     printf("count = %d\n",count);
     int i;
     //获取字段名和字段类型
     for(i = 0; i < count; i++)
     {
          printf("column name:%s\n",sqlite3_column_name(stmt,i));
          printf("column type:%i\n",sqlite3_column_type(stmt,i));
     }

//获取字段值
     int id;
     const char *name;
     int age;
     const char *addr;
     while(res == SQLITE_ROW)
     {
           id = sqlite3_column_int(stmt,0);
          name = sqlite3_column_text(stmt,1);
          age = sqlite3_column_int(stmt,2);
          addr = sqlite3_column_text(stmt,3);
          printf("id = %d,name = %s,age = %d,addr = %s\n",
          id,name,age,addr);

res = sqlite3_step(stmt);
     }
     //4
     sqlite3_finalize(stmt);
     sqlite3_close(db);
}

分类: 嵌入式学习

sqlite3 API详解相关推荐

  1. 百度PaddleOCR及云平台OCR API详解及示例

    百度PaddleOCR及云平台OCR API详解及示例 目录 百度PaddleOCR及云平台OCR API详解及示例 使用百度开源的PaddleOCR 多个开源代码库比较

  2. Java 8 Stream API详解--转

    原文地址:http://blog.csdn.net/chszs/article/details/47038607 Java 8 Stream API详解 一.Stream API介绍 Java 8引入 ...

  3. 【小白学PyTorch】扩展之Tensorflow2.0 | 21 Keras的API详解(下)池化、Normalization

    <<小白学PyTorch>> 扩展之Tensorflow2.0 | 21 Keras的API详解(上)卷积.激活.初始化.正则 扩展之Tensorflow2.0 | 20 TF ...

  4. Android复习14【高级编程:推荐网址、抠图片上的某一角下来、Bitmap引起的OOM问题、三个绘图工具类详解、画线条、Canvas API详解(平移、旋转、缩放、倾斜)、矩阵详解】

    目   录 推荐网址 抠图片上的某一角下来 8.2.2 Bitmap引起的OOM问题 8.3.1 三个绘图工具类详解 画线条 8.3.16 Canvas API详解(Part 1) 1.transla ...

  5. EXT核心API详解(二)-Array/Date/Function/Number/String

    EXT核心API详解(二)-Array/Date/Function/Number/String Array类 indexOf( Object o )  Number object是否在数组中,找不到返 ...

  6. ServletFileUpload API详解

    ServletFileUpload1.ServletFileUpload upload=new ServletFileUpload(factory);创建一个上传工具,指定使用缓存区与临时文件存储位置 ...

  7. DiskFileItemFactory API详解

    核心API介绍1.DiskFileItemFactory作用:可以设置缓存大小以及临时文件保存位置. 默认缓存大小是 10240(10k).临时文件默认存储在系统的临时文件目录下.(可以在环境变量中查 ...

  8. java nio详解,Java NIO API详解

    Java NIO API详解 在JDK 1.4以前,Java的IO操作集中在java.io这个包中,是基于流的阻塞(blocking)API.对于大多数应用来说,这样的API使用很方 便,然而,一些对 ...

  9. 【java8新特性】——Stream API详解(二)

    一.简介 java8新添加了一个特性:流Stream.Stream让开发者能够以一种声明的方式处理数据源(集合.数组等),它专注于对数据源进行各种高效的聚合操作(aggregate operation ...

  10. Java8 Date API 详解 - LocalDate,LocalDateTime,Instant

    转载来源:https://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant Java8 Date API 详解 - ...

最新文章

  1. 好书速递 | FPGA原理和结构
  2. 当前人工智能技术都在哪些领域有应用
  3. db2 创建样本数据库_db2创建数据库
  4. 那些年,冒死拍过的老师逗逼搞笑照片 !
  5. 王道操作系统考研笔记——1.1.1 操作系统的概念、功能和目标
  6. u-boot向linux内核传递启动参数
  7. privoxy支持同时代理多少个_使用ssh隧道+privoxy实现Linux全局代理
  8. 31 FI配置-财务会计-应收账款和应付账款-定义容差组(供应商)
  9. 、简述global关键字的作用_在C#编程中global关键字的作用及其用法
  10. 如何保证高可用?java删除文件夹下所有文件,技术详细介绍
  11. MySQL 阿里巴巴JAVA开发手册-MySQL相关
  12. PollingBlockTracker - encountered an error while attempting to update latest block:
  13. 安装vs2015 、如何创建MFC项目
  14. pdf转的html 360看不了,360浏览器看不了pdf
  15. 流量卡之家:物联网实施安全性是建筑行业部署物联网计划主要障碍
  16. 模拟实现透明网桥的自学习与过滤功能
  17. JS显示当前时间(包含农历时间)
  18. 支持10K高清视频是HDMI 2.1有什么特点?
  19. Python OpenCV 图片滑块验证码自动识别方案分析与自动化识别方案实现 图片相似度对比 OpenCV如何找到图片中的正方形并进行标记?
  20. 计算机无网络连接,电脑无网络连接怎么办

热门文章

  1. 杭州计算机及应用不可以落户,90%的城市取消落户限制!附杭州落户超详细攻略...
  2. 新能源车提车、上牌流程
  3. editormd html 转义,Markdown(editormd)语法解析成html(示例代码)
  4. USB网卡驱动分析(rt8152)
  5. ftp服务器复制文件命令,FTP服务器的Copy命令的使用
  6. html新年倒计时特效,js实现新年倒计时效果
  7. HCIE大师之路(六)——BGP路由综合实验
  8. 《淘宝网开店 进货 运营 管理 客服 实战200招》——1.3 常见网上开店平台
  9. http://www.techpot.net/archives/38147
  10. 为什么我们要学习C语言?