轻量级数据库

news2024/9/22 19:45:41

在计算机编程中,句柄(Handle)是一种用于标识和引用系统内部对象的标识符。句柄通常是一个不透明的指针或整数值,它代表了一个系统资源,如文件、窗口、进程、线程、内存映射文件等。句柄的主要作用是在程序中引用这些资源,而不需要直接访问它们的底层实现细节。

在C语言中,虽然可以直接调用函数,但有时候我们需要使用函数指针来实现一些特定的功能。函数指针是一个指向函数的指针,它可以存储一个函数的地址,从而允许我们通过该指针来调用该函数。下面是一些使用函数指针的理由:

1. 回调函数:•函数指针常用于传递回调函数,即一个函数被作为参数传递给另一个函数,并在适当的时候由后者调用。•这种模式在处理事件驱动编程时非常有用,例如GUI编程或者网络编程中的事件处理。

2. 策略模式:•函数指针可以用来实现简单的策略模式,即在运行时动态选择不同的算法或行为。•例如,排序函数可以接受一个比较函数作为参数,根据这个比较函数的不同实现,排序逻辑也会有所不同。

3. 通用接口:•使用函数指针可以让函数或库更加灵活,因为它们可以通过函数指针参数来适应不同的需求。•这样可以使代码更加模块化和可扩展。

4. 延迟绑定:•函数指针可以实现动态链接和延迟绑定,允许在运行时决定调用哪个函数。

5. 多态:•虽然C语言本身不支持面向对象的多态性,但可以通过使用函数指针来模拟多态行为。•例如,可以定义一个结构体包含多个函数指针,每个函数指针代表一种行为。

6. 提高性能:•在某些情况下,使用函数指针可以减少函数调用的开销,比如内联函数指针。

#include <stdio.h>

// 定义一个函数指针类型
typedef double (*CalculationFunction)(double, double);

// 函数声明
double add(double x, double y);
double subtract(double x, double y);
void calculate(double x, double y, CalculationFunction func);

// 实现加法函数
double add(double x, double y)
{
    return x + y;
}

// 实现减法函数
double subtract(double x, double y)
{
    return x - y;
}

// 使用函数指针来计算结果
void calculate(double x, double y, CalculationFunction func)
{
    double result = func(x, y);
    printf("Result: %f\n", result);
}

int main()
{
    // 调用calculate函数并传入add函数指针
    calculate(10, 5, add); // 输出: Result: 15.000000

    // 调用calculate函数并传入subtract函数指针
    calculate(10, 5, subtract); // 输出: Result: 5.000000

    return 0;
}


数据库文件与普通文件区别:

1.普通文件对数据管理(增删改查)效率低
2.数据库对数据管理效率高,使用方便

常用数据库:
1.关系型数据库:

将复杂的数据结构简化为二维表格形式
大型:Oracle、DB2
中型:MySql、SQLServer
小型:Sqlite

2.非关系型数据库
以键值对存储,且结构不固定 
//JSON
Redis
MongoDB


嵌入式数据库:
sqlite3:
stu.db
1.开源免费, c语言开发
2.代码量少,1万行左右,总大小10M以内
3.文件型数据库,可以移动
4.数据容量最大2T


sqlite3的安装
1.在线安装
sudo apt-get install sqlite3
sudo apt-get install libsqlite3-dev


2.源码安装
1.sqlite-autoconf-3080403源代码.tar.gz拷贝到Ubuntu系统Desktop目录中
2.tar -zxvf sqlite-autoconf-3080403源代码.tar.gz
3.cd sqlite-autoconf-3080403
4../configure                    // 生成makefile
5.make                           // 编译源码
6.sudo make install              // 安装


1.sqlite3 操作指令
1)命令
  .
2)SQL语句
     增 删 改 查


2. sqlite3  API接口(应用程序接口)

增,删, 改, 查

https://www.runoob.com/sqlite/sqlite-tutorial.html

sqlite命令:
1..help
  查看sqlite3支持的相关命令
  
2..quit
  退出sqlite3数据库

3..tables
  查看数据库中的所有表
  
4..schema tablename
  查看tablename创建时的SQL语句(表的结构)

5..headers on/off
  开启关闭列名称
  
6..mode column 
  以左对齐列宽显示数据 
  
7..width 第一列宽度 第二列宽度 第三列宽度 ...
  设置column模式显示下的每列的宽度

SQL语言:
1.create table 
  创建表
  create table 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);
  
  sqlite3数据类型:
  
  INTEGER : int
  REAL:double float
  TEXT: char 字符串
  NULL:值是一个 NULL值。
  
  表不存在,则创建,存在不创建
  create table if not exists 表名称(列名称1 数据类型,列名称2 数据类型,列名称3 数据类型,....);

2.insert into 
      插入表
  INSERT INTO 表名称 VALUES(值1, 值2,....)


4.select 
  查表 
  SELECT * FROM 表名称
  SELECT 列名称 FROM 表名称
  SELECT 列名称1,列名称2,列名称3 FROM 表名称

5.where
  1)条件匹配
  SELECT 列名称 FROM 表名称 WHERE 列 运算符 值
  
  运算符:
  >
  =
  <
  !=
  and
  or
  
  2)模糊查询
  SELECT * FROM 表名称 WHERE 列名 like '%冬梅'; 
  SELECT * FROM 表名称 WHERE 列名 like '马%';
  SELECT * FROM 表名称 WHERE 列名 like '马__';
  
  百分号(%)代表零个、一个或多个数字或字符。
  下划线(_)代表一个单一的数字或字符。这些符号可以被组合使用。
 
  3)顺序显示
 
 
selete * form 表名称 order by 列名 ASC;  //升序查询
selete * form 表名称 order by 列名 DESC;  //降序查询

   select * from class1 order by score ASC; 升序查询
   select * from class1 order by score DESC;降序查询


6.delete
  删除表中信息
  DELETE FROM 表名称 WHERE 列名称 = 值

7.update
  改表中信息 
  UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

8.datetime
  datetime('now', '+8 hours');
  select datetime('now', '+8 hours');
  查询当前东八区时间

 insert into class3 values(1, 'zhangsan', 99, datetime('now', '+8 hours'));
 insert into class3 values(2, 'lisi', 100, datetime('now', '+8 hours'));
     insert into class3 values(3, 'wanger', 98, datetime('now', '+8 hours'));

10. 设置主键值自动增长列
create table 表名称(id INTEGER PRIMARY KEY AUTOINCREMENT, 类名称 数据类型, ...);

  
11. drop table 表名称
    删除一张表
    
=============================================================
数据库维护命令:

  安装可视化工具
  sudo apt-get install sqlitebrowser
  
  sqlitebrowser xxx.db

  Navica tSqlite3    Windows下图形操作接口


==================================================================================================================================
sqlite数据库编程:
1.编程框架
打开数据库---》读写数据库(增,删,改,查)---》关闭数据库

sqlite3.h
-lsqlite3

2.sqlite3函数接口:
1.sqlite3_open
int sqlite3_open(
const char *filename,   /* Database filename (UTF-8) */
sqlite3 **ppDb          /* OUT: SQLite db handle */
);
功能:
打开一个数据库文件获得操作数据库文件的句柄
如果数据库存在,则打开;不存在,则创建
参数:
filename:数据库文件路径 
ppDb:存放句柄指针空间的首地址
返回值:
成功返回SQLITE_OK

2.sqlite3_errmsg
  const char *sqlite3_errmsg(sqlite3*);
  功能:
获得出错原因

3.sqlite3_close
  int sqlite3_close(sqlite3*);
  功能:
关闭数据库句柄,释放空间

4.sqlite3_exec
int sqlite3_exec(
sqlite3* pDb,                                  /* An open database */
const char *sql,                           /* SQL to be evaluated */
int (*callback)(void*,int,char**,char**),  /* Callback function */
void *arg,                                    /* 1st argument to callback */
char **errmsg                              /* Error msg written here */
);
功能:
在数据库中执行SQL语句
参数:
sqlite3*:数据库句柄 
sql     :SQL语句字符串首地址
callback:回调函数(只有select时使用)
void *  :回调函数的传参(只有select时使用)
char **errmsg:出错信息存放空间首地址
返回值:
成功返回SQLITE_OK 0

回调函数类型:
int fun(void* para,int n_column,char** column_value,char** column_name);
参数:
para  : sqlite3_exec传递的第四个参数
n_column :查询到数据的列数
column_value:查询结果每个字段的首地址集合
column_name :查询结果每个字段的字段名称首地址集合

注意: 
      1. 回调函数查询到几行数据就执行几次;
      2.回调函数必须要返回0,否则sqlite3_exec调用失败
  3.数据库中查出的数据均为字符串


5.sqlite3_free
  void sqlite3_free(void*);
  功能:释放保存出错信息的空间

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2086100.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Docker】搭建docker的私有仓库

一、为什么搭建私有仓库 docker hub虽然方便&#xff0c;但是还是有限制 需要internet连接&#xff0c;速度慢所有人都可以访问由于安全原因企业不允许将镜像放到外网 好消息是docker公司已经将registry开源&#xff0c;我们可以快速构建企业私有仓库 二、搭建简单的Registr…

《深入浅出WPF》读书笔记.10资源

《深入浅出WPF》读书笔记.10资源 背景 这一章主要讲资源&#xff0c;包括StaticResource&#xff0c;DynamicResource&#xff0c;以及二进制资源等等 资源 ResourceDictionary 资源对象为object类型&#xff0c;需要自己进行类型转换 <Window x:Class"ResourceDe…

【产品那些事】什么是软件成分分析(SCA)?

文章目录 前言背景SCA概述 功能组成工作原理软件供应链漏洞检测通用架构组件的数量和检测算法方面基于包管理器(构建)检测技术有那些检测算法&#xff1f;引用开源软件的方式方面漏洞库的积累与颗粒度 SCA产品Depency-Check基本介绍工作原理文件类型分析器工具使用体验Maven插件…

CS2饰品价格趋势怎么看?以及最佳入手时机

CS2饰品价格趋势怎么看?以及最佳入手时机 CS2饰品价格趋势怎么看?以及最佳入手时机 CS2选品时价格趋势图到底怎么看&#xff1f;什么时候值得真正入手&#xff1f;&#xff1f; 8月中上旬这波涨势大家抓住了吗&#xff1f;反正我们是抓住了。然而很多人都是听别人说行情上涨…

squareTest 破解

下载jclasslib 使用brew下载 brew install jclasslib-bytecode-viewer 准备工作 1. IDEA插件squareTest安装 2. 字节码查看器jclasslib下载&#xff1a;https://github.com/ingokegel/jclasslib/releases 破解流程(mac为例) 1. 首先找到插件jar包所在位置&#xff0c;mac…

RocketMQ第5集

一 RocketMQ的工作流程 1.1 生产环节producer Producer可以将消息写入到某Broker中的某Queue中&#xff1a;其中Producer发送消息之前&#xff0c;会先向NameServer发出获取消息Topic的路由信息的请求&#xff0c;NameServer返回该Topic的路由表及Broker列表。简单的说&…

【CPP 基础】如何把cpp库,分装给 c# 用。

基本方法 在C中封装的方法&#xff08;如在DLL中&#xff09;&#xff0c;如果输入参数是一个自定义类型&#xff0c;并且你想在C#中调用它&#xff0c;你需要做一些工作来确保数据结构在两种语言之间正确传递和解释。下面是详细的步骤。 场景描述 假设我们有一个C函数&#…

openjudge.4.6算法之贪心_746:Elevator Stopping Plan

题目 746:Elevator Stopping Plan 总时间限制: 1000ms 内存限制: 65536kB 描述 ZSoft Corp. is a software company in GaoKe Hall. And the workers in the hall are very hard-working. But the elevator in that hall always drives them crazy. Why? Because there is on…

计算机常见运算之左移操作、右移操作以及按位与、按位或

文章目录 前言一、左移操作&#xff08;<<&#xff09;和 右移操作&#xff08;>>&#xff09;1.1 左移操作&#xff08;<<&#xff09;1.2 右移操作&#xff08;>>&#xff09;1.3 应用场景 二、按位与 (&) 和 按位或 (|)2.1 按位与 (&)2.2 按…

Java、python、php版 剧本杀拼团服务平台 剧本杀管理系统(源码、调试、LW、开题、PPT)

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人 八年开发经验&#xff0c;擅长Java、Python、PHP、.NET、Node.js、Android、微信小程序、爬虫、大数据、机器学习等&#xff0c;大家有这一块的问题可以一起交流&…

谓词和量词

一、个体词和谓词 命题是一句陈述句&#xff0c;命题由个体词和谓词组成。 个体词是句子中的主语部分&#xff0c;比如这里的王童。 谓词是句子里的剩余部分&#xff0c;比如是一个三好学生 个体词用小写字母表示&#xff0c;谓词用大写字母&#xff0b;&#xff08;&#…

网络编程(学习)2024.8.29

目录 阻塞式IO(BIO) 特点 阻塞原因与阻塞反应 TCP流式套接字缓冲区 非阻塞式IO(NIO) 特点 设置非阻塞 1.通过对参数的修改实现 2.通过对文件描述符的属性进行设置 fcntl 信号驱动IO (异步IO模型) IO多路复用 select、poll、epoll IO多路复用机制 1.select …

深度学习实战2--MNIST 手写数字分类(代码在末尾)

1.本节目标&#xff1a; (1)了解什么是MNIST 数据集&#xff1b; (2)了解卷积神经网络对图片处理的流程&#xff1b; (3)能够看懂Python 编写的对图片分类任务的代码&#xff1b; (4)在一定程度上掌握处理类似任务的编程能力。 注意&#xff1a;本章节使用开源机器学习库P…

docker 部署 kkFileView 并 使用Nginx代理

拉取镜像 docker pull keking/kkfileview 运行容器 docker run -it -d -p 8012:8012 keking/kkfileview --restart always 配置nginx location /preview {# 本地运行的kkFileView的地址proxy_pass http://127.0.0.1:8012;proxy_set_header Host $host;proxy_set_header X-…

Sang.UAParser一个简单的.NET用户代理解析器

本文主要介绍了 Sang.UAParser 这个简单的.NET用户代理解析器&#xff0c;可以用来解析用户代理字符串&#xff0c;提取出其中的浏览器、操作系统等信息。这个库的使用非常简单&#xff0c;只需要引用 NuGet 包&#xff0c;然后调用相应的方法即可。 1. 简介 Sang.UAParser 是…

YOLO | YOLO目标检测算法(基础入门)

github&#xff1a;https://github.com/MichaelBeechan CSDN&#xff1a;https://blog.csdn.net/u011344545 YOLO目标检测算法 深度学习经典检测方法1、两阶段&#xff08;Two-stage&#xff09;2、单阶段&#xff08;One-stage&#xff09; 深度学习经典检测方法 1、两阶段&a…

blender修改材质时出现颜色丢失的问题

对于建立的三维模型&#xff0c;我们一般是直接使用gazebo时不会有材质的颜色信息&#xff0c;这一点还是比较烦的&#xff0c;所以这里通过blender来重新给模型上色 首先需要去安装blender&#xff1a; sudo apt install blender对于导入的模型,修改了材质后依然表现为没有颜…

如何在uni-app中使用echarts(泪的教训,保证可用,不能用来打我,保姆级教程)

线上最终实现图&#xff1a; 项目背景&#xff1a;uni-appvue2uv-uiecharts 每步都有坑&#xff0c;跟着看完 实现过程 使用了uniapp插件市场的 echarts-for-wx插件&#xff0c;以下两种方式均可 下载后将以下文件拷贝到项目的components下 如果是zip下载&#xff0c;解压后…

leetcode60.不同路径

题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示例 1: 输入:m = 3, n = 7 输出:28 示例 2:…

OpenCV绘图函数(10)根据指定像素计算字体大小的函数getFontScaleFromHeight()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 计算特定字体的大小以达到给定的像素高度。 函数原型 double cv::getFontScaleFromHeight (const int fontFace,const int pixelHeight,const…