Poco库使用:操作SQLite数据库
Sqlite是在工程项目中使用比较多的小型数据库。由于其非常小巧且占用资源低,深受开发者喜欢。这里就介绍一下如何通过Poco框架操作SQLite数据库。这里假设你已经完整编译了Poco库,如果还没有编译好,可以下载我已经编译好的Poco库。下载地址:
VS2017编译POCO静态库
首先在工程中引入依赖库PocoDataSQLite.lib,同时包含对应的头文件目录。完成对应的路径添加之后,我们就可以使用Poco库来读写SQLite数据库中的数据了。
在开始使用数据库和结束使用数据库的时候,我们需要注册和注销对应的数据库连接。这里我们采用RAII的模式在构造和析构的时候处理连接,对应的实现如下所示:
SqliteDatabase::SqliteDatabase()
{//注册连接Poco::Data::SQLite::Connector::registerConnector();
}
SqliteDatabase::~SqliteDatabase()
{//注销连接Poco::Data::SQLite::Connector::unregisterConnector();
}
完成连接的注册之后,我们就可以建立会话来操作数据库中的内容了,创建会话的方式如下所示:
//@1指定数据库的类型为SQLite
//@2指定数据库的名称为test.db
Session session(Poco::Data::SQLite::Connector::KEY, "test.db");
//拼接SQL语句
Statement stmt = (session << "SELECT * from TABLENAME");
//执行对应的SQL
stmt.stmt.execute();
完成上面的配置之后我们就可以通过SQL语句来对数据库中的内容进行处理了。下面以一个简单的数据体为例介绍一下如何通过Poco库实现对数据表的增删改查操作。数据体主要包含五个字段: 姓名,年龄,性别,身高,身份ID。对应的实现如下:
class Person {public:std::string mName;//姓名int mAge; //年龄std::string mSex; //性别int mHeight; //身高std::string mId; //身份ID
};
然后通过SQLite数据库访问类,实现数据的增删改查操作,对应的实现如下:
//SqliteDatabase.h
#ifndef _SQLITE_DATA_BASE_H_
#define _SQLITE_DATA_BASE_H_#include "Poco\Data\SQLite\SQLite.h"
#include "Poco\Data\Session.h"
#include "Poco\Mutex.h"
#include "Poco\Process.h"//添加需要的的类
using namespace Poco;
using Poco::FastMutex;
using Poco::ProcessHandle;
using Poco::Data::Session;
using Poco::Data::Keywords::now;
using Poco::Data::Keywords::use;
using Poco::Data::Keywords::bind;
using Poco::Data::Keywords::into;
using Poco::Data::Statement;//数据结构体
class Person {public:std::string mName;//姓名int mAge; //年龄std::string mSex; //性别int mHeight; //身高std::string mId; //身份ID
};class SqliteDatabase
{public:static SqliteDatabase* Instance();
private:SqliteDatabase();
public:~SqliteDatabase();//增加用户bool addNewPerson(Person& info);//删除用户bool deletePersonByID(const std::string& uuid);//修改用户信息bool updatePersonByID(const std::string& uuid, Person& info);//查找用户信息bool searchPersonByID(std::string uuid, Person& info);//判断某个用户信息是否存在bool isPersonInfoExist(const std::string& uuid);
private:static SqliteDatabase* mInstance;static FastMutex mutex;
};
#endif
//SqliteDatabase.cpp
#include "SqliteDatabase.h"
#include "Poco\Data\SQLite\Connector.h"SqliteDatabase* SqliteDatabase::mInstance = nullptr;
FastMutex SqliteDatabase::mutex;//单例模式,doublecheck,线程安全
SqliteDatabase * SqliteDatabase::Instance()
{if (mInstance == nullptr){mutex.lock();if (mInstance == nullptr){mInstance = new SqliteDatabase();}mutex.unlock();}return mInstance;
}SqliteDatabase::SqliteDatabase()
{Poco::Data::SQLite::Connector::registerConnector();
}SqliteDatabase::~SqliteDatabase()
{Poco::Data::SQLite::Connector::unregisterConnector();
}bool SqliteDatabase::addNewPerson(Person & info)
{Session session(Poco::Data::SQLite::Connector::KEY, "test.db");session << "CREATE TABLE IF NOT EXISTS PERSONINFO (UUID VARCHAR(64), NAME VARCHAR(64), AGE INTEGER(3), SEX VARCHAR(64), HEIGHT INTEGER(3))", now;if (isPersonInfoExist(info.mId)){return false;}//采用绑定的形式防止SQL注入Statement stmt = (session << "INSERT INTO PERSONINFO VALUES(:uuid, :name, :age, :sex, :height)",bind(info.mId), bind(info.mName), bind(info.mAge), bind(info.mSex), bind(info.mHeight));return (stmt.execute() > 0);
}bool SqliteDatabase::deletePersonByID(const std::string & uuid)
{Session session(Poco::Data::SQLite::Connector::KEY, "test.db");Statement stmt = (session << "DELETE FROM PERSONINFO WHERE UUID = :uuid", bind(uuid.c_str()));return (stmt.execute() == 1);
}bool SqliteDatabase::updatePersonByID(const std::string & uuid, Person & info)
{Session session(Poco::Data::SQLite::Connector::KEY, "test.db");Statement stmt = (session << "UPDATE PERSONINFO SET NAME = :name, AGE = :age, SEX = :sex, HEIGHT = :height WHERE UUID = :uuid",bind(info.mName), bind(info.mAge), bind(info.mSex), bind(info.mHeight), bind(uuid));return (stmt.execute() == 1);
}bool SqliteDatabase::searchPersonByID(std::string uuid, Person & info)
{Session session(Poco::Data::SQLite::Connector::KEY, "test.db");int age = 0;int height = 0;std::string name;std::string sex;Statement stmt = (session << "SELECT NAME, AGE, SEX, HEIGHT FROM PERSONINFO WHERE UUID = :uuid",into(name), into(age), into(sex), into(height), bind(uuid));if (stmt.execute() == 1){info.mAge = age;info.mName = name;info.mSex = sex;info.mHeight = height;info.mId = uuid;return true;}return false;
}bool SqliteDatabase::isPersonInfoExist(const std::string & uuid)
{Session session(Poco::Data::SQLite::Connector::KEY, "test.db");Statement stmt = (session << "SELECT * from PERSONINFO WHERE UUID = :uuid", bind(uuid));if (stmt.execute() == 1){return true;}return false;
}
数据库访问类,采用线程安全的单例模式,可以在多线程的场景下使用。
Poco库使用:操作SQLite数据库相关推荐
- C++ 使用Poco库操作SQLite数据库
C++ 使用Poco库操作SQLite数据库 flyfish 文章目录 C++ 使用Poco库操作SQLite数据库 数据库插入记录 数据库插入记录方式2 数据库插入记录方式3 更方便的数据库插入记录 ...
- python读数据库的通信协议是,Python操作SQLite数据库过程解析
SQLite是一款轻型的数据库,是遵守ACID的关系型数据库管理系统. 不像常见的客户-服务器范例,SQLite引擎不是个程序与之通信的独立进程,而是连接到程序中成为它的一个主要部分.所以主要的通信协 ...
- PC软件开发技术之三:C#操作SQLite数据库
我们在开发应用是经常会需要用到一些数据的存储,存储的方式有多种,使用数据库是一种比较受大家欢迎的方式.但是对于一些小型的应用,如一些移动APP,通常的数据库过于庞大,而轻便的SQLite则能解决这一问 ...
- python数据库sqlite3_Python 操作 SQLite 数据库
本文字数:3808 字 阅读本文大概需要:10 分钟 写在之前 SQLite 是一个小型的关系型数据库,它最大的特点在于不需要单独的服务.零配置.我们在之前讲过的两个数据库,不管是 MySQL 还是 ...
- C#操作SQLite数据库
我们在开发应用是经常会需要用到一些数据的存储,存储的方式有多种,使用数据库是一种比较受大家欢迎的方式.但是对于一些小型的应用,如一些移动APP,通常的数据库过于庞大,而轻便的SQLite则能解决这一问 ...
- python数据库操作sqlite_Python3操作SQLite数据库
Python3操作SQLite数据库 SQLite SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中.它是D.RichardHipp建立的公有领域项目 ...
- python数据存储系列教程——python操作sqlite数据库:连接、增删查改、指令执行
全栈工程师开发手册 (作者:栾鹏) python教程全解 python操作sqlite数据库 sqlite数据库以.db格式的文件形式存在,所以不需要安装驱动和应用系统,在标准库中也集成了sqlite ...
- python对sqlite增删改查_Python操作SQLite数据库的方法详解【导入,创建,游标,增删改查等】...
本文实例讲述了python操作SQLite数据库的方法.分享给大家供大家参考,具体如下: SQLite简介 SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的 ...
- python操作sqlite数据库
SQLite数据库是一款轻量级的数据库,无服务器.零配置.事务性的SQL数据库引擎.SQLite是世界上最广泛部署的SQL数据库引擎,而且SQLite的源代码不受版权限制,是小型项目和简单web应用的 ...
最新文章
- 当你累了,准备放弃时,看看这个吧!!!
- spring ioc原理分析
- 【Prometheus】 Prometheus 入门到实战搭建监控系统
- 如何搭建html运行环境,搭建基于express框架运行环境的方法步骤
- 【正则表达式】1.入门
- python nlp包_StanfordNLP,让你在 Python 里一手掌握 53 种自然语言分析
- IDEA中添加tomcat服务器和创建一个新的web项目
- SQL Server 2005与2000写法上的差别
- Oracle 字符串函数
- face recognition[MobiFace]
- 基于Ameoba实现mysql读写分离
- JoyOI(TYVJ)1061-Mobile Service【线性dp】
- 抖音与六大影视公司达成合作 一年内将至少与40部影片绑定营销
- 我为何选择Facebook广告
- java mysql jdbc封装类_Java-jdbc-封装类形式的数据库操作
- adblock android插件,adblock plus
- Edge浏览器出现兼容性问题且所有页面崩溃,包括设置均无法打开并访问的解决方法
- linux安装红警教程,Deepin v20下玩红警三
- 详解网站源码是什么到底该怎么使用?
- 系统介绍python魔法方法