一、前言:
 
今天试了下如何用C++类实现接口封装,感觉蛮好 。用于封装的类主要有两个,SQLiteStatement类和SQLiteWrapper类,是一个老外写的。我看了下源码,主要是对C接口进行了封装,好处自然不用说,可以重用。很佩服老外的技巧,在这里就引用下他们的代码供大家分享下他们的思想。
 
源代码链接: http://www.adp-gmbh.ch/sqlite/wrapper.html
 
二、类源码:
 
1.头文件:SQLiteWrapper.h
 
按 Ctrl+C 复制代码
 
按 Ctrl+C 复制代码
2.类实现文件:SQLiteWrapper.cpp
 
按 Ctrl+C 复制代码
 
按 Ctrl+C 复制代码
3.实例文件:
 
3.1 创建数据库和数据库表:Create_DB_Table.cpp
 
 
 
1/*
2 * 功能:创建数据库和数据库表。
3 * open():若指定数据库不存在,则创建;否则打开
4 * DirectStatement():可以用于执行大部分SQL语句,但对SELECT语句有些例外。
5 *
6 */
7 #include <iostream>
8 #include "SQLiteWrapper.h"
9
10int main() {
11 SQLiteWrapper sqlite;
12if (sqlite.Open("SQLiteWrapper.db")) {
13 std::cout<<"SQLiteWrapper.db created or opened"<<std::endl;
14 }
15else {
16 std::cout<<"couldn't open SQLiteWrapper.db"<<std::endl;
17 }
18
19if(sqlite.DirectStatement("Create table foo(bar,baz)")){
20 std::cout<<"table foo created"<<std::endl;
21 }
22else
23 std::cout<<"couldn't insert into foo"<<std::endl;
24
25return0;
26 }
 
3.2 插入数据:Insert_DB_Data.cpp
 
 
 
1/*
2 * 功能:向数据库表插入记录
3 *
4 */
5 #include <iostream>
6
7 #include "SQLiteWrapper.h"
8
9int main() {
10 SQLiteWrapper sqlite;
11if (sqlite.Open("SQLiteWrapper.db")) {
12 std::cout<<"SQLiteWrapper.db created or opened"<<std::endl;
13 }
14else {
15 std::cout<<"couldn't open SQLiteWrapper.db"<<std::endl;
16 }
17
18if(sqlite.DirectStatement("insert into foo values(1,2)")){
19 std::cout<<"values(1,2) into foo inserted"<<std::endl;
20
21 }
22else
23 std::cout<<"couldn't insert into foo"<<std::endl;
24
25return0;
26 }
 
3.3 绑定参数执行:Bind_Param_Execute.cpp
 
 
 
1/*
2 * 功能:Bind()封装sqlite3_bind_*系列函数,类中表现为重载函数,给SQL声明中的通配符赋值,若未绑定,则为空
3 * Execute():实现Sqlite3_step(s) 和Sqlite3_reset(s)机制。
4 */
5 #include <iostream>
6
7 #include "SQLiteWrapper.h"
8
9int main(){
10 SQLiteWrapper sqlite;
11if(sqlite.Open("SQLiteWrapper.db")){
12 std::cout<<"SQLiteWrapper.db created or opened"<<std::endl;
13 }
14else{
15 std::cout<<"couldn't open SQLiteWrapper.db"<<std::endl;
16 }
17
18 SQLiteStatement* stmt=sqlite.Statement("insert into foo values(?,?)");
19
20if(stmt->Bind(0,3)){
21 std::cout<<"value 3 successfully bound at pos 0"<<std::endl;
22 }
23else{
24 std::cout<<"value 3 NOT successfully bound at pos 0: "<<sqlite.LastError()<<std::endl;
25 }
26if(stmt->Bind(1, 4)){
27 std::cout<<"value 4 successfully bound at pos 1"<<std::endl;
28 }
29else{
30 std::cout<<"value 4 NOT successfully bound at pos 1:"<<sqlite.LastError()<<std::endl;
31 }
32
33// 第一次执行Execute
34if(stmt->Execute()){
35 std::cout<<"statement executed"<<std::endl;
36 }
37else{
38 std::cout<<"error executing statement: "<<sqlite.LastError()<<std::endl;
39 }
40
41if(stmt->Bind(0, 5)){
42 std::cout<<"value 5 successfully bound at pos 0"<<std::endl;
43 }
44else{
45 std::cout<<"value 5 NOT successfully bound at pos 0"<<std::endl;
46 }
47
48if(stmt->Bind(1, 6)){
49 std::cout<<"value 6 successfully bound at pos 1"<<std::endl;
50 }
51else{
52 std::cout<<"value 6 NOT successfully bound at pos 1"<<std::endl;
53 }
54
55// 第二次执行Execute
56if(stmt->Execute()){
57 std::cout<<"statement executed"<<std::endl;
58 }
59else {
60 std::cout<<"error executing statement: "<<sqlite.LastError()<<std::endl;
61 }
62
63return0;
64 }
 
3.4 输出数据库数据:Print_DB_Data.cpp
 
 
 
1/*
2 * 功能:演示了使用类成员函数获取数据库表的数据,并将数据输出到屏幕
3 * Statement():返回一个指向SQLiteStatement类的指针
4 * NextRow():只要数据未取完,就返回True
5 * DataType():返回访问列的数据类型
6 * ValueString():返回std::string.
7 */
8 #include <iostream>
9 #include "SQLiteWrapper.h"
10
11int main(){
12 SQLiteWrapper sqlite;
13if (sqlite.Open("SQLiteWrapper.db")){
14 std::cout<<"SQLiteWrapper.db created or opened"<<std::endl;
15 }
16else{
17 std::cout<<"couldn't open SQLiteWrapper.db"<<std::endl;
18 }
19
20 SQLiteStatement* stmt=sqlite.Statement("select * from foo");
21
22while(stmt->NextRow()){
23 std::cout<<stmt->DataType (0)<<" - "<<stmt->DataType (1) <<" | "<<
24 stmt->ValueString(0)<<" - "<<stmt->ValueString(1)<<std::endl;
25 }
26
27return0;
28 }
 
三、后记:
 
感叹SQLite的博大精深。
 
~~~路漫漫其修远兮,吾将上下而求索。
 

sqlite3-入门日记4-实现C++类封装的更多相关文章

  1. .Net Core ORM选择之路,哪个才适合你 通用查询类封装之Mongodb篇 Snowflake(雪花算法)的JavaScript实现 【开发记录】如何在B/S项目中使用中国天气的实时天气功能 【开发记录】微信小游戏开发入门——俄罗斯方块

    .Net Core ORM选择之路,哪个才适合你   因为老板的一句话公司项目需要迁移到.Net Core ,但是以前同事用的ORM不支持.Net Core 开发过程也遇到了各种坑,插入条数多了也特别 ...

  2. 090 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 04 使用包进行类管理(2)——导入包

    090 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  3. 089 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 使用包进行类管理(1)——创建包

    089 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  4. 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_40、Redis工具类封装讲解和实战

    笔记 4.Redis工具类封装讲解和实战     简介:高效开发方式 Redis工具类封装讲解和实战         1.常用客户端 https://redisdesktop.com/download ...

  5. XML序列化 判断是否是手机 字符操作普通帮助类 验证数据帮助类 IO帮助类 c# Lambda操作类封装 C# -- 使用反射(Reflect)获取dll文件中的类型并调用方法 C# -- 文件的压缩与解压(GZipStream)

    XML序列化   #region 序列化 /// <summary> /// XML序列化 /// </summary> /// <param name="ob ...

  6. ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪

    ASP.NET MVC深入浅出(被替换)   一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...

  7. 092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 02 static关键字(中)

    092 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  8. 091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 01 static关键字(上)

    091 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  9. salesforce 零基础学习(四十八)自定义列表分页之Pagination基类封装 ※※※

    我们知道,salesforce中系统标准列表页面提供了相应的分页功能,如果要使用其分页功能,可以访问http://www.cnblogs.com/zero-zyq/p/5343287.html查看相关 ...

随机推荐

  1. 13. DMA

    1. DMA简介 直接存储器存取(Dma)是为了提供高速数据传输外围设备和内存以及内存到内存.数据可以通过dma快速移动.没有任何CPU操作.这使得CPU资源可以用于其他操作. 这两个DMA控制器总共 ...

  2. [Java]读取文件方法大全(转载)

    1.按字节读取文件内容2.按字符读取文件内容3.按行读取文件内容4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图 ...

  3. jquery下拉框应用

    <!DOCTYPE html> <html lang="en"> <head> <script src="http://code ...

  4. HTML语法检测

    网络上收集到的资源: HTML在线编辑//////////////////////////////////////////http://tool.oschina.net/codeformat/ 文本框 ...

  5. arm-linux-objdump 的使用

    1. 查看静态库或.o 文件的组成文件 [arm@localhost gcc]$ arm­linux­objdump ­a libhello.a 2. 查看静态库或.o 文件的络组成部分的头部分 [a ...

  6. Windows系统查看xxx.dll、xxx.lib文件的导出函数、依赖文件等信息的方法

    1.查看xxx.dll或xxx.exe文件的导出函数.依赖文件等信息,使用Depends软件即可. 2.查看xxx.lib文件的导出函数.依赖文件等信息,使用Visual Studio附带工具dump ...

  7. Caused by: android.view.InflateException: Binary XML file line #18: Binary XML file line #18: Error inflating class android.widget.CheckedTextView

    困扰了我一天啊 终于吧 这个大bug  给解决掉了 可能是 当时懵逼了  竟然忘记重新构造了!!尴尬了 直接把项目的 build  文件删除重新构造了一边!!

  8. K-Anonymous Sequence

    K-Anonymous Sequence 给出一个递增的长度为n的序列\(\{a_i\}\),现在你可以进行一次操作,选择若干个数,分别减少任意一个正整数,定义权值为这些正整数之和,询问操作使得新序列 ...

  9. CF850E Random Elections

    题意:一共有n个人,要在三个人中选prefer,一开始他们心中都会想好他们的排名(共6种),之后给出的判断不会矛盾.规则如下:一共有三轮,分别是a->b,b->c,c->a,每个人选 ...

  10. MySQL安装pdf介绍

    pdf地址:https://files.cnblogs.com/files/pygo/mysql%E5%AE%89%E8%A3%85.pdf