嵌入式 SQLite 數據庫開發筆記

嵌入式 SQLite 數據庫開發入門筆記

在嵌入式開發中,數據存儲與管理是不可或缺的環節。對于資源有限的系統,輕量級數據庫 SQLite 是一個非常理想的選擇。它無需獨立服務進程,直接嵌入到應用中即可使用,既能滿足數據持久化需求,又不會過多占用系統資源。本文將結合實踐代碼,系統梳理 SQLite 在嵌入式中的使用方法。


一、SQLite 簡介

  • 定義
    SQLite 是一個輕量級的關系型數據庫管理系統(RDBMS),以文件形式存儲數據,零配置、跨平臺、易移植。

  • 適用場景

    • 嵌入式設備(路由器、物聯網設備、手持終端)

    • 本地應用配置存儲

    • 移動端(Android、iOS 應用)

  • 數據組織結構

數據庫(Database) -> 表(Table) -> 行(Row) -> 列(Column)

二、SQLite 命令行工具常用操作

SQLite 提供了簡單的命令行工具,非常適合調試和學習。

命令功能說明
.help顯示幫助信息
.database顯示當前打開的數據庫文件
.tables列出數據庫中所有表
.schema 表名查看表結構
.header on打開表頭顯示
.quit / .q退出 SQLite 命令行工具
  • 常用 SQL 語法

-- 插入數據
INSERT INTO user VALUES (1, 'zhangsan', 25);-- 查詢數據
SELECT * FROM user;
SELECT name, age FROM user WHERE age > 20;-- 更新數據
UPDATE user SET age=26 WHERE id=1;-- 刪除數據
DELETE FROM user WHERE id=2;

三、C 語言調用 SQLite

在嵌入式開發中,我們通常通過 SQLite 提供的 C API 來操作數據庫。

1. 基本流程

sqlite3 *db = NULL;
int ret = sqlite3_open("./aaa.db", &db);
if (ret != SQLITE_OK) {fprintf(stderr, "sqlite3_open error: %s\n", sqlite3_errstr(ret));sqlite3_close(db);return 1;
}char sql_cmd[] = "INSERT INTO user VALUES(11,'lisi',20);";
char *errmsg = NULL;
ret = sqlite3_exec(db, sql_cmd, NULL, NULL, &errmsg);
if (ret != SQLITE_OK) {fprintf(stderr, "sqlite3_exec error: %s\n", errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;
}sqlite3_close(db);
  • sqlite3_open():打開數據庫文件,不存在則新建。

  • sqlite3_exec():執行 SQL 語句。

  • sqlite3_close():關閉數據庫。


四、回調函數處理查詢結果

執行 SELECT 查詢時,sqlite3_exec() 可以傳入一個 回調函數,用來逐行處理結果。

1. 回調函數原型

int callback(void *arg, int col, char **result, char **title);
  • arg:用戶自定義數據指針(sqlite3_exec 的第四個參數傳入)。

  • col:當前行的列數。

  • result:字符串數組,存放每列的值。

  • title:字符串數組,存放每列的列名。

👉 特性:

  • 如果有多條結果,回調函數會被多次調用。

  • 如果結果為空,回調函數不會被調用。

2. 示例代碼

#include <sqlite3.h>
#include <stdio.h>int show(void* arg, int col, char** result, char** title)
{static int flag = 0; // 表頭只打印一次int i = 0;if (flag == 0) {flag = 1;for (i = 0; i < col; i++) {printf("%s\t", title[i]);}printf("\n");}for (i = 0; i < col; i++) {printf("%s\t", result[i] ? result[i] : "NULL");}printf("\n");return 0;
}int main()
{sqlite3* db = NULL;char* errmsg = NULL;int ret = sqlite3_open("./aaa.db", &db);if (ret != SQLITE_OK) {fprintf(stderr, "sqlite3_open %s\n", sqlite3_errstr(ret));sqlite3_close(db);return 1;}char sql_cmd[] = "SELECT * FROM user;";ret = sqlite3_exec(db, sql_cmd, show, NULL, &errmsg);if (ret != SQLITE_OK) {fprintf(stderr, "sqlite3_exec error: %s\n", errmsg);sqlite3_free(errmsg);sqlite3_close(db);return 1;}sqlite3_close(db);return 0;
}

3. 輸出示例

假設表內容如下:

CREATE TABLE user (id INTEGER PRIMARY KEY, name TEXT, age INTEGER);
INSERT INTO user VALUES (1, 'zhangsan', 25);
INSERT INTO user VALUES (2, 'lisi', 30);

程序運行結果:

id    name    age
1     zhangsan    25
2     lisi        30

五、嵌入式 SQLite 開發心得

  1. 數據庫文件位置

    • 嵌入式系統 Flash 容量有限,建議放在合適的分區,并避免頻繁寫入。

  2. 事務優化

    • 默認每次寫入都會同步到磁盤,效率低。

    • 使用事務:

      BEGIN TRANSACTION;
      INSERT INTO user VALUES(3,'wangwu',22);
      INSERT INTO user VALUES(4,'zhaoliu',28);
      COMMIT;
      

      可以顯著提高批量插入速度。

  3. 內存占用

    • SQLite 默認內存消耗較低,但在嵌入式系統中仍需注意查詢規模,避免一次性查詢過大數據集。

  4. 回調 vs 預編譯接口

    • sqlite3_exec() 簡單易用,適合小型查詢。

    • 更復雜場景可使用 預編譯語句 APIsqlite3_prepare_v2 / sqlite3_step / sqlite3_finalize),性能更好。


六、總結

SQLite 在嵌入式系統中有以下優勢:

  • 單文件存儲,移植方便

  • 零配置、無需后臺進程

  • 支持標準 SQL,功能完備

  • 資源占用低,適合嵌入式場景

通過本文的學習,你可以在嵌入式系統中完成數據庫文件的創建、數據的增刪改查,以及通過 回調函數 高效獲取查詢結果。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96247.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96247.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96247.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Spark面試題及詳細答案100道(71-80)-- 配置與部署

《前后端面試題》專欄集合了前后端各個知識模塊的面試題&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

Redis 面試

1、主從集群1、構建主從集群單節點Redis的并發能力是有上限的&#xff0c;要進一步提高Redis的并發能力&#xff0c;就需要搭建主從集群&#xff0c;實現讀寫分離。主寫從讀&#xff0c;主可以讀也可以寫&#xff0c;從只能讀利用docker-compose文件來構建主從集群&#xff1a;…

如何使用PostgreSQL數據庫進行數據挖掘與預測分析

如何使用PostgreSQL數據庫進行數據挖掘與預測分析 關鍵詞:PostgreSQL,數據挖掘,預測分析,數據庫,機器學習 摘要:本文旨在深入探討如何利用PostgreSQL數據庫進行數據挖掘與預測分析。首先介紹了使用PostgreSQL進行此類操作的背景信息,包括目的、預期讀者、文檔結構等。接…

ZooKeeper vs Redis:分布式鎖的實現與選型指南

一、Redis 分布式鎖&#xff1a;追求極致的性能 Redis 分布式鎖基于內存操作&#xff0c;其核心思想是在內存中設置一個唯一的鍵值對來表示鎖的持有。 1. 基礎實現&#xff08;SETNX Lua&#xff09; 最簡單的實現是使用 SETNX&#xff08;SET if Not eXists&#xff09;命令&…

vue基于Springboot框架的考研咨詢平臺系統實現

目錄前言-本系統介紹已開發項目效果實現截圖開發技術詳細介紹核心代碼參考示例1.建立用戶稀疏矩陣&#xff0c;用于用戶相似度計算【相似度矩陣】2.計算目標用戶與其他用戶的相似度系統測試總結源碼獲取詳細視頻演示或者查看其他版本&#xff1a;文章底部獲取博主聯系方式&…

蘋果用戶速更新!macOS存嚴重漏洞,用戶隱私數據面臨泄露風險

漏洞概況近日&#xff0c;macOS系統發現一個CVSS評分高達 9.8 的高危漏洞&#xff0c;該漏洞可能允許應用程序繞過系統保護機制&#xff0c;非法訪問受保護的用戶數據。該漏洞編號為 CVE-2025-24204&#xff0c;目前已有概念驗證&#xff08;PoC&#xff09;代碼公開。漏洞影響…

海盜王64位dx9客戶端修改篇之五

在海盜王3.0客戶都升級64位dx9版本的過程中&#xff0c;因為特效的問題&#xff0c;被卡殼了很久。 開始是精靈草的粒子效果、白銀城的煙囪煙霧效果、篝火的效果、陽光透射效果、海浪效果等&#xff0c;修了很長的時間&#xff0c;才找到竅門弄好。 然后是精靈效果、角色陰影。…

Linux學習——管理網絡安全(二十一)

一、管理服務器防火墻&#xff08;firewalld&#xff09;RHEL 默認使用 firewalld 作為防火墻管理工具&#xff0c;它通過 “區域&#xff08;zone&#xff09;” 和 “服務&#xff08;service&#xff09;” 的概念簡化規則配置&#xff0c;支持動態更新規則而無需重啟服務。…

leetcode-python-1941檢查是否所有字符出現次數相同

題目&#xff1a; 給你一個字符串 s &#xff0c;如果 s 是一個 好 字符串&#xff0c;請你返回 true &#xff0c;否則請返回 false 。 如果 s 中出現過的 所有 字符的出現次數 相同 &#xff0c;那么我們稱字符串 s 是 好 字符串。 示例 1&#xff1a; 輸入&#xff1a;s “…

Snort的介紹

當然可以。以下是對 Snort 的全面介紹&#xff0c;涵蓋其定義、核心功能、三種運行模式、工作原理、規則系統以及應用場景等內容。 Snort 網絡入侵檢測系統&#xff08;NIDS&#xff09;詳解 一、Snort 簡介 Snort 是一款開源的、輕量級但功能強大的 網絡入侵檢測與防御系統&…

滴滴二面準備(一)

結合你的簡歷內容和技術面試問題&#xff0c;以下是一個結構化的回答建議&#xff0c;突出你的技術深度和項目經驗&#xff1a;2. 項目與實習經歷 得物低代碼落地頁編輯器&#xff08;核心項目&#xff09; 背景&#xff1a;解決軟廣落地頁開發周期長、迭代慢問題。技術方案&am…

socket通信在Windows和Linux上的區別

前言 筆者在將socket通信的自定義類從Linux移植到Windows時遇到一些問題&#xff0c;整理下來希望幫助到需要的人&#xff0c;同時也加深自己的理解。 差異 頭文件 #ifdef _WIN32 #include <ws2tcpip.h> #define inet_pton InetPton #define SHUT_RDWR SD_BOTH #define M…

一款將PDF轉化為機器可讀格式的工具介紹

ps:以下內容來自MinerU項目 MinerU 項目簡介 MinerU是一款將PDF轉化為機器可讀格式的工具&#xff08;如markdown、json&#xff09;&#xff0c;可以很方便地抽取為任意格式。 MinerU誕生于書生-浦語的預訓練過程中&#xff0c;我們將會集中精力解決科技文獻中的符號轉化問…

代碼隨想錄算法訓練營第三十九天|62.不同路徑 63.不同路徑ll

62.不同路徑&#xff1a; 文檔講解&#xff1a;代碼隨想錄|62.不同路徑 視頻講解&#xff1a;https://www.bilibili.com/video/BV1ve4y1x7Eu 狀態&#xff1a;已做出 一、題目要求&#xff1a; 一個二維數組里&#xff0c;將(0&#xff0c;0)位置下標作為起點&#xff0c;計算…

openEuler2403安裝部署Prometheus和Grafana

文章目錄openEuler2403安裝部署Prometheus和Grafana一、前言1.簡介2.環境二、正文1.環境準備1&#xff09;JDK 安裝部署&#xff08;可選&#xff09;2&#xff09;關閉防火墻2.安裝 Prometheus1&#xff09;下載和安裝2&#xff09;啟動3&#xff09;systemd服務管理3.安裝 Gr…

樂吾樂大屏可視化組態軟件【SQL數據源】

樂吾樂大屏可視化組態軟件&#xff08;大屏可視化設計器 - 樂吾樂Le5le&#xff09;支持直接對接SQL數據源功能&#xff0c;目前僅對企業源碼客戶開放。 配置SQL數據源 管理員進入可視化管理中心&#xff0c;點擊SQL數據源&#xff0c;配置添加SQL數據源。 創建SQL數據源連接 …

Django高效查詢:values_list實戰詳解

Django 實戰案例 講解 values_list 的用法。 values_list("field", flatTrue) → 獲取單字段的一維列表。values_list("f1", "f2") → 獲取多個字段&#xff0c;返回元組。搭配 filter / distinct / in / 外鍵查詢 非常高效。適合用于 導出數據 …

Java數據結構——樹

一、樹型結構1.1 概念我們之前提到的數組&#xff0c;單鏈表&#xff0c;棧和隊列都是一種線性結構&#xff0c;每個元素都有最多一個后繼節點。而樹型結構是一種非線性結構&#xff0c;它是由n&#xff08;n>0&#xff09;節點組成的一個具有層次關系的集合。它之所以叫做樹…

基于LLM的月全食時空建模與智能預測:從天文現象到深度學習融合

當古老的天文學遇上現代人工智能,會碰撞出怎樣的火花? 一、當月球遇見AI 月全食,這一令人驚嘆的天文現象,自古以來就吸引著無數天文學家和愛好者的目光。當地球恰好運行到太陽和月球之間,完全遮擋太陽光時,我們就能目睹月球逐漸被"吞噬"然后又重煥光彩的奇妙…

LeetCode熱題 42.接雨水

題目 思路&#xff1a; 通過畫圖觀察我們其實可以很容易發現&#xff0c;每個柱子接多少水由這個地方左邊最高的柱子和右邊最高的柱子確定&#xff0c;因為總要形成一個坑嘛&#xff0c;然后就能接著確定&#xff1a; 當前柱子接水量 min(左邊最高柱子的高度, 右邊最高柱子的…