文档章节

SQLite学习手册(实例代码<一>)

涩女郎
 涩女郎
发布于 2015/08/26 21:21
字数 1418
阅读 4
收藏 0
点赞 0
评论 0

一、获取表的Schema信息:

    1). 动态创建表。
    2). 根据sqlite3提供的API,获取表字段的信息,如字段数量以及每个字段的类型。
    3). 删除该表。
    见以下代码及关键性注释:

复制代码
 1 #include <sqlite3.h>  2 #include <string>  3  4 using namespace std;  5  6 void doTest()  7 {  8 sqlite3* conn = NULL;  9 //1. 打开数据库 10 int result = sqlite3_open("D:/mytest.db",&conn); 11 if (result != SQLITE_OK) { 12 sqlite3_close(conn); 13 return; 14 } 15 const char* createTableSQL = 16 "CREATE TABLE TESTTABLE (int_col INT, float_col REAL, string_col TEXT)"; 17 sqlite3_stmt* stmt = NULL; 18 int len = strlen(createTableSQL); 19 //2. 准备创建数据表,如果创建失败,需要用sqlite3_finalize释放sqlite3_stmt对象,以防止内存泄露。 20 if (sqlite3_prepare_v2(conn,createTableSQL,len,&stmt,NULL) != SQLITE_OK) { 21 if (stmt) 22 sqlite3_finalize(stmt); 23 sqlite3_close(conn); 24 return; 25 } 26 //3. 通过sqlite3_step命令执行创建表的语句。对于DDL和DML语句而言,sqlite3_step执行正确的返回值 27 //只有SQLITE_DONE,对于SELECT查询而言,如果有数据返回SQLITE_ROW,当到达结果集末尾时则返回 28 //SQLITE_DONE。 29 if (sqlite3_step(stmt) != SQLITE_DONE) { 30 sqlite3_finalize(stmt); 31 sqlite3_close(conn); 32 return; 33 } 34 //4. 释放创建表语句对象的资源。 35 sqlite3_finalize(stmt); 36 printf("Succeed to create test table now.\n"); 37 //5. 构造查询表数据的sqlite3_stmt对象。 38 const char* selectSQL = "SELECT * FROM TESTTABLE WHERE 1 = 0"; 39 sqlite3_stmt* stmt2 = NULL; 40 if (sqlite3_prepare_v2(conn,selectSQL,strlen(selectSQL),&stmt2,NULL) != SQLITE_OK) { 41 if (stmt2) 42 sqlite3_finalize(stmt2); 43 sqlite3_close(conn); 44 return; 45 } 46 //6. 根据select语句的对象,获取结果集中的字段数量。 47 int fieldCount = sqlite3_column_count(stmt2); 48 printf("The column count is %d.\n",fieldCount); 49 //7. 遍历结果集中每个字段meta信息,并获取其声明时的类型。  50 for (int i = 0; i < fieldCount; ++i) { 51 //由于此时Table中并不存在数据,再有就是SQLite中的数据类型本身是动态的,所以在没有数据时 52 //无法通过sqlite3_column_type函数获取,此时sqlite3_column_type只会返回SQLITE_NULL, 53 //直到有数据时才能返回具体的类型,因此这里使用了sqlite3_column_decltype函数来获取表声 54 //明时给出的声明类型。 55 string stype = sqlite3_column_decltype(stmt2,i); 56 stype = strlwr((char*)stype.c_str()); 57 //下面的解析规则见该系列的“数据类型-->1. 决定字段亲缘性的规则”部分,其链接如下: 58 //http://www.cnblogs.com/stephen-liu74/archive/2012/01/18/2325258.html 59 if (stype.find("int") != string::npos) { 60 printf("The type of %dth column is INTEGER.\n",i); 61 } else if (stype.find("char") != string::npos 62 || stype.find("text") != string::npos) { 63 printf("The type of %dth column is TEXT.\n",i); 64 } else if (stype.find("real") != string::npos 65 || stype.find("floa") != string::npos 66 || stype.find("doub") != string::npos ) { 67 printf("The type of %dth column is DOUBLE.\n",i); 68 } 69 } 70 sqlite3_finalize(stmt2); 71 //8. 为了方便下一次测试运行,我们这里需要删除该函数创建的数据表,否则在下次运行时将无法 72  //创建该表,因为它已经存在。 73 const char* dropSQL = "DROP TABLE TESTTABLE"; 74 sqlite3_stmt* stmt3 = NULL; 75 if (sqlite3_prepare_v2(conn,dropSQL,strlen(dropSQL),&stmt3,NULL) != SQLITE_OK) { 76 if (stmt3) 77 sqlite3_finalize(stmt3); 78 sqlite3_close(conn); 79 return; 80 } 81 if (sqlite3_step(stmt3) == SQLITE_DONE) { 82 printf("The test table has been dropped.\n"); 83 } 84 sqlite3_finalize(stmt3); 85 sqlite3_close(conn); 86 } 87 88 int main() 89 { 90 doTest(); 91 return 0; 92 } 93 //输出结果为: 94 //Succeed to create test table now. 95 //The column count is 3. 96 //The type of 0th column is INTEGER. 97 //The type of 1th column is DOUBLE. 98 //The type of 2th column is TEXT. 99 //The test table has been dropped.
复制代码

二、常规数据插入:

    1). 创建测试数据表。
    2). 通过INSERT语句插入测试数据。
    3). 删除测试表。
    见以下代码及关键性注释:

复制代码
 1 #include <sqlite3.h>  2 #include <string>  3 #include <stdio.h>  4  5 using namespace std;  6  7 void doTest()  8 {  9 sqlite3* conn = NULL; 10 //1. 打开数据库 11 int result = sqlite3_open("D:/mytest.db",&conn); 12 if (result != SQLITE_OK) { 13 sqlite3_close(conn); 14 return; 15 } 16 const char* createTableSQL = 17 "CREATE TABLE TESTTABLE (int_col INT, float_col REAL, string_col TEXT)"; 18 sqlite3_stmt* stmt = NULL; 19 int len = strlen(createTableSQL); 20 //2. 准备创建数据表,如果创建失败,需要用sqlite3_finalize释放sqlite3_stmt对象,以防止内存泄露。 21 if (sqlite3_prepare_v2(conn,createTableSQL,len,&stmt,NULL) != SQLITE_OK) { 22 if (stmt) 23 sqlite3_finalize(stmt); 24 sqlite3_close(conn); 25 return; 26 } 27 //3. 通过sqlite3_step命令执行创建表的语句。对于DDL和DML语句而言,sqlite3_step执行正确的返回值 28 //只有SQLITE_DONE,对于SELECT查询而言,如果有数据返回SQLITE_ROW,当到达结果集末尾时则返回 29  //SQLITE_DONE。 30 if (sqlite3_step(stmt) != SQLITE_DONE) { 31 sqlite3_finalize(stmt); 32 sqlite3_close(conn); 33 return; 34 } 35 //4. 释放创建表语句对象的资源。 36 sqlite3_finalize(stmt); 37 printf("Succeed to create test table now.\n"); 38 39 int insertCount = 10; 40 //5. 构建插入数据的sqlite3_stmt对象。 41 const char* insertSQL = "INSERT INTO TESTTABLE VALUES(%d,%f,'%s')"; 42 const char* testString = "this is a test."; 43 char sql[1024]; 44 sqlite3_stmt* stmt2 = NULL; 45 for (int i = 0; i < insertCount; ++i) { 46 sprintf(sql,insertSQL,i,i * 1.0,testString); 47 if (sqlite3_prepare_v2(conn,sql,strlen(sql),&stmt2,NULL) != SQLITE_OK) { 48 if (stmt2) 49 sqlite3_finalize(stmt2); 50 sqlite3_close(conn); 51 return; 52 } 53 if (sqlite3_step(stmt2) != SQLITE_DONE) { 54 sqlite3_finalize(stmt2); 55 sqlite3_close(conn); 56 return; 57 } 58 printf("Insert Succeed.\n"); 59 } 60 sqlite3_finalize(stmt2); 61 //6. 为了方便下一次测试运行,我们这里需要删除该函数创建的数据表,否则在下次运行时将无法 62 //创建该表,因为它已经存在。 63 const char* dropSQL = "DROP TABLE TESTTABLE"; 64 sqlite3_stmt* stmt3 = NULL; 65 if (sqlite3_prepare_v2(conn,dropSQL,strlen(dropSQL),&stmt3,NULL) != SQLITE_OK) { 66 if (stmt3) 67 sqlite3_finalize(stmt3); 68 sqlite3_close(conn); 69 return; 70 } 71 if (sqlite3_step(stmt3) == SQLITE_DONE) { 72 printf("The test table has been dropped.\n"); 73 } 74 sqlite3_finalize(stmt3); 75 sqlite3_close(conn); 76 } 77 78 int main() 79 { 80 doTest(); 81 return 0; 82 } 83 //输出结果如下: 84 //Succeed to create test table now. 85 //Insert Succeed. 86 //Insert Succeed. 87 //Insert Succeed. 88 //Insert Succeed. 89 //Insert Succeed. 90 //Insert Succeed. 91 //Insert Succeed. 92 //Insert Succeed. 93 //Insert Succeed. 94 //Insert Succeed. 95 //The test table has been dropped.
复制代码

© 著作权归作者所有

共有 人打赏支持
涩女郎
粉丝 35
博文 104
码字总数 160210
作品 0
浦东
高级程序员
安卓应用安全指南 4.5.3 使用 SQLite 高级话题

安卓应用安全指南 4.5.3 使用 SQLite 高级话题 原书:Android Application Secure Design/Secure Coding Guidebook 译者:飞龙 协议:CC BY-NC-SA 4.0 4.5.3.1 在 SQL 语句的断言中使用通配符...

apachecn_飞龙 ⋅ 03/22 ⋅ 0

【防衰老教程】-windows环境下安装SQLite

什么是 SQLite? SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。...

Weijue ⋅ 05/09 ⋅ 0

Android_6.数据存储3_SQLite存储之创建数据库

本文是以Android Studio为开发工具,<> 为学习指导书籍的学习记录 6.4 SQLite数据 SQLite用于存储大量复杂的关系型数据,是内置在Android系统的一种轻量级的关系型数据库,它有速度快,占用资...

橄榄工作室 ⋅ 05/26 ⋅ 0

【Kotlin For Android】(三): Anko 库

一、简介 Github地址 是一个使 Android应用程序 开发更快,更容易的库。它使你的代码变得简洁易读,并让您忘记 的粗糙边缘。 Anko 由几部分组成: :一个轻量级的库,里面充满了,对话框,日...

Agnes2017 ⋅ 04/27 ⋅ 0

python中的SQLite数据库

python中的SQLite数据库 Python SQLITE数据库是一款非常小巧的嵌入式开源数据库软件,也就是说没有独立的维护进程,所有的维护都来自于程序本身。它使用一个文件存储整个数据库,操作十分方便...

幸运券发放 ⋅ 05/03 ⋅ 0

Node.js 的 SQLite 教程

在本教程中,我将演示如何结合sqlite3 Node.js驱动程序在Node.js环境中使用SQLite。 对于那些不熟悉SQLite的人来说,它是一个简单的单文件关系数据库,在智能设备,嵌入式系统甚至小型Web应用...

oschina ⋅ 05/31 ⋅ 0

Xamarin SQLite教程数据库访问与生成

Xamarin SQLite教程数据库访问与生成 在本教程中,我们将讲解如何开发SQLite相关的App。在编写程序前,首先需要做一些准备工作,如了解Xamarin数据库访问方式,添加引用,构建使用库文件等。...

大学霸 ⋅ 今天 ⋅ 0

写一个“特殊”的查询构造器 - (一、程序结构,基础封装)

程序的结构 本篇开始,正式进入编码实践中。首先,简单的规划下程序的结构。 如上一篇所说的,我们需要一个基类 PDODriver 用来封装 PDO 的一些公用的方法,Mysql 等每个数据库都新建一个类 ...

MrQ被抢注了 ⋅ 05/11 ⋅ 0

C语言实现的CGI,完成了留言板功能

地址:https://github.com/zhouweiit/cgi 基于ngnix+spawn_cgi+fastcgi作为服务器,使用C语言编写的cgi,实现了简单的留言板功能; 项目结构简介: 1.conf主要包含了nginx与fastcig的配置 2....

zhouweiit_ ⋅ 05/09 ⋅ 0

EFCore2.0@Xamarin.Forms

由于忙于Xamarin的书的创作很久没有和大家见面了,回到博客我会陆续更新一些最新的Xamarin技术,还有最近一直在努力的人工智能相关知识。话说csdn的博客改版了。总觉得变化是好事情啊。 这篇...

dotNET跨平台 ⋅ 05/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Thrift RPC实战(二) Thrift 网络服务模型

TServer类层次体系 TSimpleServer/TThreadPoolServer是阻塞服务模型 TNonblockingServer/THsHaServer/TThreadedSelectotServer是非阻塞服务模型(NIO) 1 TServer抽象类的定义 内部静态类Args的...

lemonLove ⋅ 11分钟前 ⋅ 0

vim命令用法

第五章 vim命令 vim和vi几乎是一样的,唯一的区别就是当编辑一个文本时,使用vi不会显示颜色,而使用vim会显示颜色。 vim有三个模式:一般模式,编辑模式,命令模式。 系统最小化安装时没有安...

弓正 ⋅ 13分钟前 ⋅ 0

MyBatis源码解读之配置

1. 目的 本文主要介绍MyBatis配置文件解析,通过源码解读mybatis-config.xml(官方默认命名)、Mapper.xml 与Java对象的映射。 2. MyBatis结构 查看大图 MyBatis结构图,原图实在太模糊了,所以...

无忌 ⋅ 16分钟前 ⋅ 0

Ignite的jdbc与网格的连接方式的查询性能对比

环境: 数据量100万 Ignite2.5 Windows10 8g jdbc方式连接 import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; i......

仔仔1993 ⋅ 31分钟前 ⋅ 0

收集自网络的wordpress 分页导航的代码教程(全网最全版)

wordpress 分页导航是用来切换文章的一个功能,添加了 wordpress 分页导航后,用户即可自由到达指定的页面数浏览分类文章,而这样的一个很简单功能却有很多朋友在用插件:WP-PageNavi,插件的...

Rhymo-Wu ⋅ 47分钟前 ⋅ 0

微服务 WildFly Swarm 入门

Hello World 就像前面章节中的其他框架一样,我们希望添加一些基本的 Hello-world 功能,然后在其上逐步添加更多的功能。让我们从在我们的项目中创建一个 HolaResources 开始。您可以使用您的...

woshixin ⋅ 54分钟前 ⋅ 0

Maven的安装和Eclipse的配置

1. 下载Maven 下载地址 2. 解压压缩包,放到自己习惯的硬盘中 此处我将其放到了 D:\Tools 目录下。 3. 配置环境变量 右键此电脑 -> 属性 -> 高级系统设置 -> 环境变量。 在系统变量中新建,变...

影狼 ⋅ 今天 ⋅ 0

python pip使用国内镜像的方法

国内源 清华:https://pypi.tuna.tsinghua.edu.cn/simple 阿里云:http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/ 华中理工大学:http://......

良言 ⋅ 今天 ⋅ 0

对于url变化的spa应该如何使用微信jssdk

使用vue单页面碰上微信jssdk config验证失败的坑。第一次成功 之后切换页面全部失败,找到了解决方法,第一次验证成功后保存验证信息 切换页面时验证信息直接拿来用,加一个wx.error() 失败时...

孙冠峰 ⋅ 今天 ⋅ 0

Spring Cloud Gateway 一般集成

SCF发布,带来很多新东西,不过少了点教程,打开方式又和以前的不一样,比如这个SCG,压根就没有入门指导,所以这里写一个,以备后用。 一、集成 pom.xml <dependency> <groupI...

kut ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部