当前位置: 首页 > news >正文

SQLite数据库介绍

文章目录

    • SQLite
      • 常用接口
    • 使用示例
    • 测试

SQLite

SQLite是一个本地化的数据库,不需要客户端服务端什么的配置,主打就是轻量化方便化

他也不是一个独立的进程,而是可以根据应用程序的需求,可以进行静态或者动态的连接

而且他是直接存储在磁盘文件的,提供了简单易用的API接口

需要注意的是 在SQLite中一个数据库对应了一个数据库文件

常用接口

int sqlite3_threadsafe(); 
// 查看是否启用线程安全 0-未启用 1-启用

sqlite有三种安全模式

  1. 非线程安全模式
  2. 线程安全模式(不同的连接在不同的线程是安全的,或者说进程间是安全的,一个句柄不能用于多线程之间)
  3. 串行化模式(可以在不同的线程或者进程之间使用同一个句柄)
int sqlite3_open(const char* filename, sqlite3 **ppDb);
int sqlite3_open_v2(const char* filename, sqlite3 **ppDb, int flags, const char* *zVfs);

这里是创建或者打开数据库的两种操作

第一个参数是文件名,第二个参数是传入一个句柄指针的地址

第三个参数是flag是可以设置文件的打开方式,提供下面的宏可以选择

  • SQLITE_OPEN_READWRITE: 读写方式打开数据库文件
  • SQLITE_OPEN_CREATE: 不存在数据库文件则创建
  • SQLITE_OPEN_NOMUTEX: 多线程模式,只要不同线程使用不同的连接即可保证线程安全
  • SQLITE_OPEN_FULLMUTEX: 串行化模式,即打开所有的锁

当返回值为SQLITE_OK (0)表示数据库成功打开 操作成功

如果是其他值的话就代表着有问题,需要查找对应的宏来看到

int sqlite_exec(sqlite3, char* sql, int(*callback)(void*, int, char**, char**), void* arg, char ** err);

这是一个执行语句的操作函数

这里面需要传入一个回调函数,对查询到的结果进行处理

返回值含义和上一个是一样的

int (*callback) (void*, int, char**, char**);
  • void* 是用来设置回调时传入的arg参数,一般来说是用于将数据存于某个地址
  • int 一行中的列数
  • char** 存储一行数据的字符指针数组
  • char** 每一列的字段名
  • int返回值,成功处理需要返回一个0,如果返回非0程序会直接中断退出

使用示例

/*封装SqliteHelper类提供简单的sqlite数据库操作接口1. 创建/打开数据库2. 针对打开的数据库执行操作1. 表操作2. 数据操作3. 关闭数据库
*/
#include <iostream>
#include <string>
#include <vector>
#include <sqlite3.h>
#include <functional>
#include "../logs/Xulog.h"class SqliteHelper
{
public:typedef int (*SqliteCallback)(void *, int, char **, char **);SqliteHelper(const std::string &dbfile): _dbfile(dbfile), _handler(nullptr){}bool open(int safe_level = SQLITE_OPEN_FULLMUTEX){int ret = sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_level, nullptr);if (ret != SQLITE_OK){ERROR("打开SQLite数据库失败: %s", sqlite3_errmsg(_handler));return false;}return true;}bool exec(const std::string &sql, SqliteCallback cb, void *arg){int ret = sqlite3_exec(_handler, sql.c_str(), cb, arg, nullptr);if (ret != SQLITE_OK){ERROR("%s--执行语句失败: %s", sql.c_str(), sqlite3_errmsg(_handler));return false;}return true;}void close(){sqlite3_close_v2(_handler);}private:std::string _dbfile;sqlite3 *_handler;
};

测试

#include "Sqlite3.hpp"
#include <cassert>int select_stu_callback(void *arg, int col_count, char **result, char **fields_name)
{std::vector<std::string> *array = (std::vector<std::string> *)arg;array->push_back(result[0]);return 0;
}
int main()
{SqliteHelper helper("./test.db");// 创建或打开数据库文件assert(helper.open());// 创建表const char *ct = "CREATE TABLE IF NOT EXISTS stu (sn INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR(32), age INT);";assert(helper.exec(ct, nullptr, nullptr));// 数据操作语句// const char *insert_sql = "INSERT INTO stu (sn, name, age) VALUES (1, 'Morty', 16), (2, 'Summer', 18), (3, 'Rick', 58);";// assert(helper.exec(insert_sql, nullptr, nullptr));// const char *update_sql = "UPDATE stu SET name='S.Morty' WHERE sn=1;";// assert(helper.exec(update_sql, nullptr, nullptr));// const char *delete_sql = "DELETE FROM stu WHERE sn=2;";// assert(helper.exec(delete_sql, nullptr, nullptr));const char *select_sql = "SELECT name FROM stu;";std::vector<std::string> arr;assert(helper.exec(select_sql, &select_stu_callback, &arr));for (auto &name : arr){std::cout << name << " ";}std::cout << std::endl;// 关闭数据库helper.close();return 0;
}

相关文章:

SQLite数据库介绍

文章目录 SQLite常用接口 使用示例测试 SQLite SQLite是一个本地化的数据库,不需要客户端服务端什么的配置,主打就是轻量化方便化 他也不是一个独立的进程,而是可以根据应用程序的需求,可以进行静态或者动态的连接 而且他是直接存储在磁盘文件的,提供了简单易用的API接口 需…...

点击label 按钮起作用

要使点击 标签时能够触发与之关联的表单控件&#xff08;如输入框、复选框或单选按钮&#xff09;的作用&#xff0c;你需要正确地设置 标签的 for 属性&#xff0c;并确保该属性值与表单控件的 id 属性值相匹配。这样&#xff0c;当用户点击 标签时&#xff0c;与之关联的表…...

JPA、Hibernate、MyBatis三种ORM框架怎么选择

JPA&#xff08;Java Persistence API&#xff09;、Hibernate和MyBatis都是Java开发中常用的ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;框架&#xff0c;它们提供了不同的方式来处理数据库交互。在选择这些框架时&#xff0c;需要考虑项目…...

【C++】map详解

&#x1f4e2;博客主页&#xff1a;https://blog.csdn.net/2301_779549673 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff01; &#x1f4e2;本文由 JohnKi 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f4e2;未来很长&#…...

力扣206.反转链表

题目链接&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5]输出&#xff1a;[5,4,3,2,1] 示例 2&#xff1a; …...

如何查看服务器的带宽linux服务器

speedtest-cli ubuntu # 安装speedtest-cli sudo apt install speedtest-cli # 执行测试 speedtest --secure # 在其他博客可以看到使用以下的命令&#xff0c;但是我试了没用 speedtest-cli参考&#xff1a; https://ubuntu-mate.community/t/speedtest-cli-error/25722/2…...

云原生化 - 工具镜像(完整版)

在微服务和云原生环境中,容器化的目标之一是尽可能保持镜像小型化以提高启动速度和减少安全风险。然而,在实际操作中,有时候需要临时引入一些工具来进行调试、监控或问题排查。Kubernetes提供了临时容器(ephemeral containers)的功能,允许在不改变原始容器镜像的情况下,…...

leetcode68:文本左右对齐

给定一个单词数组 words 和一个长度 maxWidth &#xff0c;重新排版单词&#xff0c;使其成为每行恰好有 maxWidth 个字符&#xff0c;且左右两端对齐的文本。 你应该使用 “贪心算法” 来放置给定的单词&#xff1b;也就是说&#xff0c;尽可能多地往每行中放置单词。必要时可…...

Linux驱动学习——内核编译

1、从官网下载适合板子的Linux内核版本 选择什么版本的内核需要根据所使用的硬件平台而定&#xff0c;最好使用硬件厂商推荐使用的版本 https://www.kernel.org/pub/linux/kernel/ 2、将压缩包复制到Ubuntu内进行解压 sudo tar -xvf linux-2.6.32.2-mini2440-20150709.tgz 然…...

MES系统:制造业的智能大脑

引言 在当今快速变化的制造业环境中&#xff0c;企业面临着激烈的市场竞争和不断变化的客户需求。为了保持竞争力&#xff0c;制造企业必须提高生产效率、降低成本、缩短产品上市时间&#xff0c;并确保产品质量。MES&#xff08;制造执行系统&#xff09;作为一种先进的生产管…...

忘记 MySQL 密码怎么办:破解 root 账户密码

忘记 MySQL 密码怎么办&#xff1a;破解 root 账户密码 目录 忘记 MySQL 密码怎么办&#xff1a;破解 root 账户密码1、修改 MySQL 配置文件2、不使用密码登录 MySQL3、重置 root 用户密码4、修改 MySQL 配置文件并重启 MySQL 服务5、使用新密码登录 MySQL 如果忘记密码导致无法…...

【LeetCode每日一题】——17.电话号码的字母组合

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】 一【题目类别】 回溯 二【题目难度】 中等 三【题目编号】 17.电话号码的字母组合 四【题目描述】 给定一个…...

Git管理远程仓库

添加远程仓库 要新增远程&#xff0c;请在终端上存储存储库的目录中使用 git remote add 命令。 git remote add 命令采用两个参数&#xff1a; 远程名称&#xff08;例如 origin&#xff09;远程 URL&#xff08;例如 https://github.com/OWNER/REPOSITORY.git&#xff09;…...

在 /var/cache/apt/archives/ 上没有足够的可用空间的解决方法

问题 apt-get upgrade 更新软件包时&#xff0c;提示没有足够的空间。 分析 一般来说&#xff0c;除非下载的文件过于大&#xff0c;整个服务器的内存都不够用&#xff0c;否则可以改变默认的下载路径进行下载。 解决方法 找一个空间足够的目录&#xff0c;新建一个单独的…...

FastAdmin Apache下设置伪静态

FastAdmin Apache下设置伪静态 一、引言 FastAdmin 是一个基于ThinkPHP和Bootstrap框架开发的快速后台开发框架&#xff0c;它以其简洁、高效、易于扩展的特点&#xff0c;广受开发者的喜爱。在部署FastAdmin项目时&#xff0c;为了提高访问速度和用户体验&#xff0c;我们通…...

MPI程序实例:自适应数值积分(主从模式)

目录 一、主从模式的自适应梯形公式 二、串行程序 三、基于非阻塞通信的并行程序 四、基于散发/收集通信的并行程序 上一节我们介绍了采用梯形公式结合自适应局部区间加密,计算一个函数在给定区间上的定积分达到指定精度。 MPI程序实例:自适应数值积分-CSDN博客…...

蓝桥杯—STM32G431RBT6(IIC通信--EEPROM(AT24C02)存储器进行通信)

一、什么是IIC&#xff1f;24C02存储器有什么用&#xff1f; IIC &#xff08;IIC 是半双工通信总线。半双工意味着数据在某一时刻只能沿一个方向传输&#xff0c;即发送数据的时候不能接收数据&#xff0c;接收数据的时候不能发送数据&#xff09;即集成电路总线&#xff08;…...

【重学 MySQL】六十二、非空约束的使用

【重学 MySQL】六十二、非空约束的使用 定义目的关键字特点作用创建非空约束删除非空约束注意事项 在MySQL中&#xff0c;非空约束&#xff08;NOT NULL Constraint&#xff09;是一种用于确保表中某列不允许为空值的数据库约束。 定义 非空约束&#xff08;NOT NULL Constra…...

Python获取json返回的字符串获取方法大全

1、使用 json.loads() 解析JSON字符串 import jsonjson_string {"name": "Alice", "age": 25, "city": "Beijing"} data json.loads(json_string)# 获取字符串值 name data[name] print("Name:", name) # 输…...

FreeBSD14.1 rm命令的疑惑

在/tmp目录发现有很多目录和文件&#xff0c;准备把它们都删除&#xff0c;结果发现都删不掉 这些文件目录如图&#xff1a; /tmp % ls -la total 9143 drwxrwxrwt 421 root wheel 486 10月 8 11:58 . drwxr-xr-x 23 root wheel 32 10月 8 10:06 .. drwx----…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版​分享

平时用 iPhone 的时候&#xff0c;难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵&#xff0c;或者买了二手 iPhone 却被原来的 iCloud 账号锁住&#xff0c;这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

Linux --进程控制

本文从以下五个方面来初步认识进程控制&#xff1a; 目录 进程创建 进程终止 进程等待 进程替换 模拟实现一个微型shell 进程创建 在Linux系统中我们可以在一个进程使用系统调用fork()来创建子进程&#xff0c;创建出来的进程就是子进程&#xff0c;原来的进程为父进程。…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...