Sqlite 数据库操作(二)—— Sqlite常用API 及其使用方法

news2024/11/17 11:51:10

要使用sqlite数据库的API,需要满足两个条件:

  • 安装sqlite3函数库                          —— 终端输入 sudo apt-get install libsqlite3-dev 
  • 在程序中引入头文件 sqlite3.h        —— #include <sqlite3.h>
  • gcc编译时链接 sqlite3动态库         —— gcc -o sqlite3_t sqlite3_t.c -lsqlite3      


         目录

1、打开数据库文件 sqlite3_open

2、关闭数据库文件 sqlite3_close

3、执行sql语句 sqlite3_exec

(1) sqlite3_exec

(2) 回调函数 callback 参数解析

4、查询表格数据 sqlite3_get_table

5、总结:使用上述API实现表格的创建及增删查改


1、打开数据库文件 sqlite3_open

第一个参数 filename:数据库名称(输入型参数)。sqlite3命令创建数据库的时候,会生成一个数据库文件 xxx.db ,这里要填的就是该数据库文件的路径。

第二个参数ppDb:数据库操作句柄(输出型参数)。后续的增删查改操作都需要通过该句柄实现

返回值:成功返回 SQLITE_OK,失败返回错误码,可以使用sqlite3_errmsg函数获取错误信息。

#include <sqlite3.h>

#define DATABASE "/home/linux/myproject.db"

sqlite3* db;
if(sqlite3_open(DATABASE, &db) != SQLITE_OK){
    printf("%s\n", sqlite3_errmsg(&db));  
    exit(1);
}

2、关闭数据库文件 sqlite3_close

参数是数据库操作句柄,如果关闭成功返回SQLITE_OK,如果数据库还处在使用状态,那就会关闭失败,此时返回 SQLITE_BUSY。

3、执行sql语句 sqlite3_exec

(1) sqlite3_exec

第一个参数 sqlite3:数据库操作句柄

第二个参数 sql:要执行的sql语句

第三个参数 callback:回调函数。只有在执行查询语句的时候,才会需要传参,其他执行语句,直接填NULL。只有在查询的时候,会返回查询结果,回调函数的参数大部分是输出型参数,用于返回查询结果。

第四个参数 args:给回调函数传递的参数。

第五个参数 errmsg:执行sql语句时产生的错误信息。

返回值:成功返回SQLITE_OK;失败返回错误码

int callback(void* arg, int ncolumns , char** f_value, char** f_name)
{}

char** errmsg;
if(sqlite3_exec(&db, "select * from project", callback, NULL, &errmsg) != SQLITE_OK)
{
    printf("%s\n", errmsg);  
}

(2) 回调函数 callback 参数解析

在查询的过程中,每查询到一条记录就会通过回调函数返回,而不是查询到所有数据再一起返回

int callback(void* arg, int ncolumns , char** f_value, char** f_name);

第一个参数 arg:sqlite_exec传递过来的参数

第二个参数 ncolumns:列数

第三个参数 f_value:某一个字段的所有内容

第四个参数 f_name:字段名称

4、查询表格数据 sqlite3_get_table

除了使用 sqlite3_exec 来查询表格内容外,还可以使用 sqlite3_get_table 来直接获取到表格内容,该函数无需传入回调函数。

第一个参数 db:数据库操作句柄

第二个参数 zSql:要执行的sql语句

第三个参数 pazResult:查询到的表格数据。该指针指向的空间是动态开辟的,使用完以后,我们需要使用 sqlite3_free_table 来释放这块空间。

第四个参数 pnRow:查询结果的行数。即有多少条记录

第五个参数 pnColumn:查询结果的列数。即每一条记录有多少个字段

第六个参数 pzErrmsg:执行语句时产生的错误信息

返回值:成功返回SQLITE_OK;失败返回错误码

如果表格内容如下:

那么结果返回的内容如下:

5、总结:使用上述API实现表格的创建及增删查改

#include <stdio.h>
#include <unistd.h>
#include <sqlite3.h>

#define DATABASE "/home/linux/myproject.db"

int main(){
	sqlite3* db;
	// 1.打开数据库文件
	if(sqlite3_open(DATABASE, &db) != SQLITE_OK){
		printf("%s\n",(char*)sqlite3_errmsg(db));  
		return 1;
	}


	// 2.新建一个表格
	char** errmsg;
	const char* sql = "drop table if exists project;\
				  create table project(id integer, device char, code integer);";
	if(sqlite3_exec(db, sql, NULL, NULL, errmsg) != SQLITE_OK)
	{
		printf("%s\n", *errmsg);  
		return 1;
	}

	// 3.插入一条记录
	sql = "insert into project values(1, '冰箱', 1001);";
	if(sqlite3_exec(db, sql, NULL, NULL, errmsg) != SQLITE_OK)
	{
		printf("%s\n", *errmsg); 
	}
	
	// 4.修改记录
	sql = "update project set device='电饭煲' where id=1;";
	if(sqlite3_exec(db, sql, NULL, NULL, errmsg) != SQLITE_OK)
	{
		printf("%s\n", *errmsg); 
	}

	// 5.查询记录
	sql = "select * from project;";
	char** sqlRes;
	int nRows;
	int nColumns;
	int i, j;
	if(sqlite3_get_table(db, sql, &sqlRes, &nRows, &nColumns, errmsg)==SQLITE_OK)
	{
		for(i = 0; i <= nRows; i++)
		{
			for(j = 0; j < nColumns; j++)
			{
				printf("%-11s", sqlRes[i*nColumns + j]);
			}
			printf("\n");
		}
	}

	// 6.删除一条记录
	sql = "delete from project where id=1;";
	if(sqlite3_exec(db, sql, NULL, NULL, errmsg) != SQLITE_OK)
	{
		printf("%s\n", *errmsg); 
	}

	// 关闭数据库文件
	sqlite3_close(db);
	return 0;
}

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

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

相关文章

atompark:外贸工具-Atomic 6合一系列产品-Crack

Atomic Studio 邮件发件人Atomic Mail Sender 我们最畅销的电子邮件活动工具 邮件发件人 群发邮件发件人 使用我们内置的 SMTP 或您自己的&#xff01; 按姓名称呼收件人 移除退订者 电子邮件猎手 发现网站上的电子邮件地址 按关键字搜索 执行高速和准确的搜索 邮件验证器 …

Synchronized原理

Synchronized原理一、基本特点二、加锁工作过程 (锁升级/锁膨胀)2.1 偏向锁2.2 轻量级锁2.3 重量级锁三、锁消除四、锁粗化五、总结一、基本特点 结合锁策略&#xff0c;我们就可以总结出 Synchronized 具有以下特性(只考虑 JDK 1.8)&#xff1a; 开始时是乐观锁, 如果锁冲突…

数据结构.数组

数据结构.数组1.数组的概念和特点2.数组的定义和初始化3.数组的遍历4.数组的基本操作&#xff08;不多说 注解很详细&#xff09;5.操作的时间复杂度1.数组的概念和特点 数组就是一种容器&#xff08;装数据的&#xff09;&#xff0c;用来存储相同类型的数据值。 数组的特点…

RRT_star MATLAB

colormap 函数 创建栅格地图 clc clear close all%% 构建颜色MAP图 cmap [1 1 1; ... % 1-白色-空地0 0 0; ... % 2-黑色-静态障碍1 0 0; ... % 3-红色-动态障碍1 1 0;... % 4-黄色-起始点 1 0 1;... % 5-品红-目标点0 1 0…

Canal同步mysql binlog至pulsar

Canal 一、简介 canal [kə’nl]&#xff0c;主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费 基于日志增量订阅和消费的业务包括 数据库镜像数据库实时备份索引构建和实时维护(拆分异构索引、倒排索引等)业务 cache 刷新带业务逻辑的增量数据处…

【数据结构】队列(链式队列)

作者&#xff1a;一个喜欢猫咪的的程序员 专栏&#xff1a;《数据结构》 喜欢的话&#xff1a;世间因为少年的挺身而出&#xff0c;而更加瑰丽。 ——《人民日报》 目录 队列的结构和概念&#xff1a; Queue.h文件 Queue.c文件 Test.c文件&am…

ElasticSearch分布式架构原理

一个ES集群中有多个Server节点&#xff0c;每个Server节点中含有多个Index。 主节点&#xff08;Master&#xff09; 主资格节点的主要职责是和集群操作相关的内容&#xff0c;如创建或删除索引&#xff0c;跟踪哪些节点是集群的一部分&#xff0c;并决定哪些分片分配给相关的…

文件系统篇

目录 1.文件系统的基本组成 1.1.文件 1.1.1.目录项和目录是一个东西吗&#xff1f; 1.1.2.那文件数据是如何存储在磁盘的呢&#xff1f; 2.page cache 2.1.进程写文件时&#xff0c;进程发生了崩溃&#xff0c;已写入的数据会丢失吗 2.2.page cache是什么&#xff1f; …

Docker:网络配置

目录 一、网络模式简介 二、bridge模式以及host模式的命令演示 bridge模式 host模式 三、自定义网络 一、网络模式简介 Docker在创建容器时有四种网络模式&#xff1a;bridge/host/container/none&#xff0c;bridge为默认不需要用--net去指定&#xff0c;其他三种模式需要…

CAS机制和synchronize的原理及其优化机制(锁消除 偏向锁 自旋锁 膨胀锁 锁粗化)

乐观锁的问题&#xff1a;并不总是能处理所有问题&#xff0c;所以会引入一定的系统复杂度。 读写锁 把加锁操作分成了俩种 一是读锁二是写锁 也就是说在读和读之间是没有互斥的 但是在读写和写写之间就会存在互斥 如果一个场景是一写多度 那么使用这个效率就会很高 重量级锁…

【数据结构与算法】B_树

目录 前言&#xff1a; 一、B树 1、B树概念 2、B树查找 3、B树插入 4、B树前序遍历 5、B树性能 二、B、B*树 1、B树概念 2、B树的插入 2、B*树概念 3、总结 三、B系列树的应用 总结 前言&#xff1a; 我们已经有很多索引的数据结构了 例如&#xff1a; 顺序查找 …

CAD外部参照文件的分解

最近遇到一个编图要求&#xff1a; “图纸文件的内容主要由模型空间和布局空间内的信息组成&#xff0c;尽量减少外部参照的使用。” 我们的综合图分幅主要依照外部参照来的&#xff0c;图件的本体只有1个&#xff0c;分幅图中只有布局试图有点线面等实体存在&#xff0c;模型…

阿里二面:用过GC日志可视化工具进行JVM调优吗?

上周有个小伙伴面了阿里&#xff0c;在二面中被问到GC日志分析&#xff0c;感觉回答的不是很好&#xff0c;过来找我复盘&#xff0c;大致听了他的回答&#xff0c;虽然回答出了部分&#xff0c;但是没抓到重点。 GC日志分析算是JVM调优中比较难的部分&#xff0c;今天这篇文章…

0123 双指针 Day12

剑指 Offer 25. 合并两个排序的链表 输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 示例1&#xff1a; 输入&#xff1a;1->2->4, 1->3->4 输出&#xff1a;1->1->2->3->4->4 /*** Definition for si…

安科瑞嵌入式多功能计量表AEM96 精度0.5S级 2-31次分次谐波

安科瑞 王晶淼/刘芳 一、产品概述 AEM系列三相嵌入式电能计量表是一款主要针对电力系统、工矿企业、公用设施的电能统计、管理需求而设计的智能电能表&#xff0c;集成三相电力参数测量及电能计量与考核管理&#xff0c;提供上24时&#xff0c;上31日以及上12月的电能数据统计…

DNS 区域传送漏洞(dns-zone-tranfer)学习

DNS 区域传送漏洞&#xff08;dns-zone-tranfer&#xff09;学习 ———— 相关知识理解 DNS&#xff08;域名系统&#xff09;就像一个互联网电话簿。它负责将人类可读的主机名解析为机器可读的 IP 地址。 DNS服务器分为主服务器&#xff0c;备份服务器&#xff0c;缓存服务…

【Docker】多个容器和宿主机之间如何进行数据同步和数据共享?容器数据卷从介绍到常用操作图文教程

专栏往期文章 《Docker是什么&#xff1f;Docker从介绍到Linux安装图文详细教程》《30条Docker常用命令图文举例总结》《Docker如何构建自己的镜像&#xff1f;从镜像构建到推送远程镜像仓库图文教程》 前言 你是否担心 Docker 容器被删除后&#xff0c;容器内的重要数据就丢…

VFIDILDKVENAIHNAAQVGIGFAKPFEKLINPK,果蝇抗菌肽

果蝇抗菌肽是一种含有Lys的抗菌多肽&#xff0c;序列中包含34个氨基酸&#xff0c;是一种含有α-折叠的抗菌多肽。 编号: 223981中文名称: 果蝇抗菌肽&#xff0c;Andropin英文名: Antimicrobial Peptide Andropin单字母: H2N-VFIDILDKVENAIHNAAQVGIGFAKPFEKLINPK-OH三字母: H2…

自然语言处理(NLP)数据集汇总 3(附下载链接)

&#x1f384;&#x1f384;【自然语言处理NLP】简介 &#x1f384;&#x1f384; 自然语言处理(Natural Language Processing, NLP)是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门…

Allure:根据step动态设置description

背景 使用pytestAllure进行自动化的时候,为了报告展示更明确会使用 with allure.step(xxx)和 allure.step(xxx)测试结束后就可以看到 测试步骤 Allure还支持配置Description 之前直接在case中编写,例如 """ [用例描述]: 专家问诊 [前置步骤]:1. 打开h5页面…