上位机图像处理和嵌入式模块部署(树莓派4b下使用sqlite3)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        嵌入式设备下面,有的时候也要对数据进行处理和保存。如果处理的数据不是很多,一般用json就可以。但是数据如果量比较大,但是还没有达到要用大型数据库的时候,这种情况下选择一个sqlite3这样的数据库,其实就可以了。所以,不管是上位机,还是在linux开发板上面,大家都喜欢用sqlite3来对数据进行处理和保存。今天,正好借助于这样一个机会,学习下sqlite3。

1、安装sqlite3开发库

        安装的方法不复杂,直接sudo apt-get安装即可,

sudo apt-get install libsqlite3-dev

2、准备测试代码

        准备的测试代码不复杂,主要就是创建一个student.db。创建好了之后,建设一张表。有了这张表,就可以做增、删、改、查的动作了。最后肯定就是关闭数据库。

#include <sqlite3.h>
#include <stdio.h>int main() {sqlite3 *db;char *err_msg = 0;// Open the databaseint rc = sqlite3_open("student.db", &db);if (rc != SQLITE_OK) {fprintf(stderr, "Cannot open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// SQL statement to create a tableconst char *create_table_sql = "CREATE TABLE IF NOT EXISTS student_table (id INTEGER PRIMARY KEY, name TEXT)";// Execute the SQL statement to create the tablerc = sqlite3_exec(db, create_table_sql, 0, 0, &err_msg);if (rc != SQLITE_OK) {fprintf(stderr, "SQL error: %s\n", err_msg);sqlite3_free(err_msg);sqlite3_close(db);return 1;}// SQL statement to insert dataconst char *insert_sql = "INSERT INTO student_table (id, name) VALUES (?, ?)";// Prepare the insert statementsqlite3_stmt *stmt;rc = sqlite3_prepare_v2(db, insert_sql, -1, &stmt, NULL);if (rc != SQLITE_OK) {fprintf(stderr, "Failed to prepare insert statement: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// Bind parameters and execute the insert statementint id = 1;const char *name = "John";sqlite3_bind_int(stmt, 1, id);sqlite3_bind_text(stmt, 2, name, -1, SQLITE_STATIC);rc = sqlite3_step(stmt);if (rc != SQLITE_DONE) {fprintf(stderr, "Error inserting data: %s\n", sqlite3_errmsg(db));sqlite3_finalize(stmt);sqlite3_close(db);return 1;}// Finalize the insert statementsqlite3_finalize(stmt);// SQL query to select dataconst char *select_sql = "SELECT * FROM student_table";// Prepare and execute the queryrc = sqlite3_prepare_v2(db, select_sql, -1, &stmt, NULL);if (rc != SQLITE_OK) {fprintf(stderr, "Failed to execute select statement: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// Iterate over the resultswhile ((rc = sqlite3_step(stmt)) == SQLITE_ROW) {// Process each rowint id = sqlite3_column_int(stmt, 0);const unsigned char *name = sqlite3_column_text(stmt, 1);// Process the data...printf("ID: %d, Name: %s\n", id, name);}// Check for errors or end of dataif (rc != SQLITE_DONE) {fprintf(stderr, "Error reading data: %s\n", sqlite3_errmsg(db));}// Finalize the query statementsqlite3_finalize(stmt);// SQL statement to update dataconst char *update_sql = "UPDATE student_table SET name = ? WHERE id = ?";// Prepare the update statementrc = sqlite3_prepare_v2(db, update_sql, -1, &stmt, NULL);if (rc != SQLITE_OK) {fprintf(stderr, "Failed to prepare update statement: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// Bind parameters and execute the update statementconst char *new_name = "Alice";sqlite3_bind_text(stmt, 1, new_name, -1, SQLITE_STATIC);sqlite3_bind_int(stmt, 2, id);rc = sqlite3_step(stmt);if (rc != SQLITE_DONE) {fprintf(stderr, "Error updating data: %s\n", sqlite3_errmsg(db));sqlite3_finalize(stmt);sqlite3_close(db);return 1;}// Finalize the update statementsqlite3_finalize(stmt);// SQL statement to delete dataconst char *delete_sql = "DELETE FROM student_table WHERE id = ?";// Prepare the delete statementrc = sqlite3_prepare_v2(db, delete_sql, -1, &stmt, NULL);if (rc != SQLITE_OK) {fprintf(stderr, "Failed to prepare delete statement: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 1;}// Bind parameter and execute the delete statementsqlite3_bind_int(stmt, 1, id);rc = sqlite3_step(stmt);if (rc != SQLITE_DONE) {fprintf(stderr, "Error deleting data: %s\n", sqlite3_errmsg(db));sqlite3_finalize(stmt);sqlite3_close(db);return 1;}// Finalize the delete statementsqlite3_finalize(stmt);// Close the databasesqlite3_close(db);return 0;
}

3、编译测试代码

        编译也可以直接用g++编译,需要注意的就是链接的时候把sqlite3加上。

g++ db.cpp -g -o db -lsqlite3

4、测试和验证

        测试有两种,一种是直接执一下./db,看看结果如何。还有一种就是gdb db,然后单步看一下过程。个人是比较推崇后面一种方式。当然,执行的过程中,我们也可以添加一些别的数据之后,用navicat之类的软件,看下db里面是不是真的存在相关的数据。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

TCP/IP协议族中的TCP(一):解析其关键特性与机制

⭐小白苦学IT的博客主页⭐ ⭐初学者必看&#xff1a;Linux操作系统入门⭐ ⭐代码仓库&#xff1a;Linux代码仓库⭐ ❤关注我一起讨论和学习Linux系统 前言 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的、基于字…

深度学习从入门到精通——词向量介绍及应用

词向量介绍 词向量&#xff08;Word embedding&#xff09;&#xff0c;即把词语表示成实数向量。“好”的词向量能体现词语直接的相近关系。词向量已经被证明可以提高NLP任务的性能&#xff0c;例如语法分析和情感分析。词向量与词嵌入技术的提出是为了解决onehot的缺陷。它把…

debian配置BIND DNS服务器

前言 局域网内有很多台主机&#xff0c;IP难以记忆。 而修改hosts文件又难以做到配置共享和统一&#xff0c;需要一台内网的DNS服务器。 效果展示 这里添加了一个域名hello.dog&#xff0c;将其指向为192.168.1.100。 同时&#xff0c;外网的域名不会受到影响&#xff0c;…

力扣48. 旋转图像

Problem: 48. 旋转图像 文章目录 题目描述思路复杂度Code 题目描述 思路 1.初始化&#xff1a;首先&#xff0c;我们需要获取矩阵的长度len&#xff0c;这将用于后续的索引计算。 2.外层循环&#xff1a;我们使用一个外层循环for (int i 0; i < len / 2; i)来遍历矩阵的每一…

关于加强电力系统通信与电网调度自动化建设问题的规定

关于加强电力系统通信与电网调度自动化建设问题的规定 为了保障电力系统安全、经济、优质、可靠运行&#xff0c;必须加强电网调度管理和提高技术装备水平。根据当前电网技术装备状况&#xff0c;结合电力系统通信和电网调度自动化的特点&#xff0c;以及今后规划发展的要求&am…

SpringBoot---------Hutool

第一步&#xff1a;引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-parent</artifactId><version>5.7.17</version></dependency> 第二步&#xff1a;各种用法 ①生成随机数 //生成验证码 String s …

Docker常用命令(镜像、容器)

一、镜像 1.1 存出镜像 1.2 载入镜像 1.3 上传镜像 二、容器 2.1 容器创建 2.2 查看容器的运行状态 ​2.3 启动容器 2.4 创建并启动容器 2.5 在后台持续运行 docker run 创建的容器 2.6 终止容器运行 2.7 容器的进入 ​2.8把宿主机的文件传入到容器内部 2.9 从容器…

vite和webpacke的常规配置

文章目录 1、vite和webpacke的区分2、vite的常规配置介绍主要部分介绍vite基本配置示例 3、webpacke的常规配置介绍主要部分介绍Webpack 基本配置示例 1、vite和webpacke的区分 相同点&#xff1a; 都是构建工具&#xff0c;用于资源打包 &#xff1b; 都有应用到摇树原理 tre…

PUBG绝地求生进游戏就闪退 绝地求生进游戏慢?3个解决方法分享

《绝地求生》(PUBG) 是由韩国Krafton工作室开发的一款战术竞技型射击类沙盒游戏。2022年1月12日&#xff0c;该游戏于主机和PC上可免费下载游玩。在该游戏中&#xff0c;玩家需要在游戏地图上收集各种资源&#xff0c;并在不断缩小的安全区域内对抗其他玩家&#xff0c;让自己生…

袁庭新ES系列15节|Elasticsearch客户端基础操作

前言 上一章节我们介绍了搭建Elasticsearch集群相关的知识。那么又该如何来操作Elasticsearch集群呢&#xff1f;在ES官网中提供了各种语言的客户端&#xff0c;我们在项目开发过程中有多种Elasticsearch版本和连接客户端可以选择&#xff0c;那么他们有什么区别&#xff1f;这…

appium相关的知识

>adb shell dumpsys window | findstr mCurrentFocus adb devices # 实例化字典 desired_caps = dict() desired_caps[platformName] = Android desired_caps[platformVersion] = 9 # devices desired_caps[deviceName] = emulator-5554 # 包名 desired_caps[appPackage] …

Pytest基础

1.用例的设计原则 用Pytest写用例时候&#xff0c;一定要按照下面的规则去写&#xff0c;否则不符合规则的测试用例是不会执行的 1、文件名以 test_.py 文件和test.py 2、以 test 开头的函数 3、以 Test 开头的类&#xff0c;不能包含__init__方法 4、以 test_ 开头的类里面的…

【js】解决自动生成颜色时相邻颜色视觉相似问题的技术方案

解决自动生成颜色时相邻颜色视觉相似问题的技术方案 在进行大规模颜色生成时&#xff0c;特别是在数据可视化、用户界面设计等应用领域&#xff0c;一个常见的挑战是确保相邻颜色在视觉上具有足够的区分度。本文介绍的方法通过结合黄金分割比与饱和度、亮度的周期性变化&#…

科研基础与工具(论文写作)

免责申明&#xff1a; 本文内容只是学习笔记&#xff0c;不代表个人观点&#xff0c;希望各位看官自行甄别 参考文献 科研基础与工具&#xff08;YouTube&#xff09; 学术写作句型 Academic Phrase bank 曼彻斯特大学维护的一个网站 写论文的时候&#xff0c;不不知道怎么…

LMDeploy量化部署LLMVLM实践-笔记五

本次课程由西北工业大学博士生、书生浦源挑战赛冠军队伍队长、第一期书生浦语大模型实战营优秀学员【安泓郡】讲解【OpenCompass 大模型评测实战】课程 课程视频&#xff1a;https://www.bilibili.com/video/BV1tr421x75B/ 课程文档&#xff1a;https://github.com/InternLM/…

IP-guard getdatarecord 存在任意文件读取

声明 本文仅用于技术交流&#xff0c;请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;文章作者不为此承担任何责任。 一、产品介绍 IP-guard是由溢信科技股份有限公司开发的一款终端安全管…

STM32单片机通过ST-Link 烧录和调试

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. ST-LINK V2 2. 操作步骤 2.1 连接方式 2.2 驱动安装常规步骤 2.3 Keil中的设置 3. 调式仿真 4. 常见问题排查 1. ST-LINK V2 ST LINK v2下载器用于STM32单片机&#xff0c;可以下载程序、调试…

01、创建型-单例模式--只有一个实例

文章目录 前言一、基本介绍1.1 什么是单例模式1.2 为什么要用单例模式1.3 应用场景1.4 单例优缺点 二、单例模式的实现方式2.1 饿汉式单例2.1.1 静态变量方式2.1.2 静态代码块 2.2 懒汉式单例2.2.1 懒汉式单例2.2.2 懒汉式优化①-线程安全2.2.2 懒汉式优化②-双重检查锁2.2.3 懒…

构建NodeJS库--前端项目的打包发布

1. 前言 学习如何打包发布前端项目&#xff0c;需要学习以下相关知识&#xff1a; package.json 如何初始化配置&#xff0c;以及学习npm配置项&#xff1b; 模块类型type配置&#xff0c; 这是nodejs的package.json的配置main 入口文件的配置 webpack 是一个用于现代 JavaSc…

spring boot3单模块项目工程搭建-上(个人开发模板)

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 目录 写在前面 上文衔接 常规目录创建 common目录 exception.handle目录 result.handle目录 controller目录 service目录 mapper目录 entity目录 test目录 写在最后 写在前面 本文…