C++項目快速配置SQLite

前言:完全沒接觸過數據庫,但老師課程設計要求數據存儲在數據庫怎么辦???主包看了些網絡上的資源,覺得講得都不是很能快速上手,所以決定自己寫一篇博客

SQLiteCpp是一個基于 C++ 封裝的 SQLite 操作庫,簡化原生 C API 使用,可以用面向對象的方式更方便地操作數據庫。

準備工作

安裝 SQLiteCpp

從GitHub上下載 SQLiteCpp 源碼

地址:https://github.com/SRombauts/SQLiteCpp

?

點擊右上角綠色按鈕「Code」→ 「Download ZIP」,解壓得到一個 SQLiteCpp-master 文件夾?

下載并準備 sqlite3.c/.h

SQLiteCpp 依賴原生 SQLite 的源碼,所以我們去官網?https://www.sqlite.org/download.html

下載sqlite3.c(源碼),sqlite3.h(頭文件)這兩個文件,用于編譯

?

點擊第二個“sqlite-amalgamation-*.zip”壓縮包,解壓后就能得到.c和.h文件

往下滑,我的電腦是64位的windows系統,所以還下載了“Precompiled Binaries for Windows”的第二個壓縮包sqlite3.dll,用于程序運行時動態鏈接

第三個壓縮包“sqlite-tools-win-x64-3500100.zip”,是帶命令行工具的,sqlite3.exe可以在終端里手動打開 .db 文件查看和操作(非常適合調試數據庫),推薦下載

?

把這些文件放入你的C++項目的一個 “sqlite”?文件夾中備用

用 Code::Blocks 創建 SQLiteCpp 靜態庫項目

后面需要連接SQL靜態庫,但我想直接連自己的(也可以網上下載別人的先測試,那就自己跳過這一部分)

打開 Code::Blocks → File → New → Project,創建一個Static Library

將 SQLiteCpp 源碼添加進來

SQLiteCpp-master/src/ 下的所有 .cpp 文件和SQLiteCpp-master/include/SQLiteCpp/下所有的.h文件都添加進項目

再把 sqlite3.csqlite3.h?和sqlite3ext.h加進來(SQLiteCpp 依賴它)

設置頭文件搜索路徑?

雖然你添加了文件,但 編譯器默認不會自動搜索別的文件夾,你需要手動告訴它在哪里找?

Build options → Search directories → Compiler,添加SQLiteCpp-master/include的文件地址

以及SQLiteCpp\sqlite-amalgamation-3500100的地址(是 sqlite3.h 所在目錄)

構建靜態庫?

編譯后,會生成一個 .a 文件(MinGW 下是 libSQLiteCppStatic.a,MSVC 是 .lib

編譯成功

.a文件在bin目錄的debug文件下

添加 SQLite3 源碼文件

創建一個C++項目

在項目中點擊右鍵 → Add files...

?

添加你下載的 sqlite3.c文件(噢我的文件夾好像有點多,下次注意)

?

?添加 SQLiteCpp 的頭文件路徑

主包第一次弄哈,為了安全起見只修改當前項目的編譯器配置,而不會影響整個 Code::Blocks 環境。

右鍵項目 → Build Options...,左邊選你的項目名(不是 "Debug"也不是 "Release")這樣設置就只對當前項目生效。

?

點擊Search directories → Compiler,點擊"Add"

復制你SQLiteCpp-master/include的文件地址和\sqlite-amalgamation-3500100(sqlite3.h 所在目錄)的文件地址,添加

?

添加庫文件路徑

Search directories → Linker,添加.a的包含文件SQLiteCppStatic\bin\Debug

鏈接庫文件

Linker settings →Link libraries,點擊 Add

嘗試運行

輸入以下代碼,如能正常編譯并運行 → 就代表 .a 鏈接庫成功了?

#include <SQLiteCpp/SQLiteCpp.h>
#include <iostream>int main() {try {SQLite::Database db("test.db", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);db.exec("CREATE TABLE IF NOT EXISTS test (id INTEGER PRIMARY KEY, name TEXT);");db.exec("INSERT INTO test (name) VALUES ('Alice');");std::cout << "數據庫操作成功!" << std::endl;} catch (std::exception& e) {std::cerr << "錯誤:" << e.what() << std::endl;}return 0;
}

哇哦,主包運行成功了,成功一小步,go on!go on!

接下來可以開始在你的系統中使用 SQLite 數據庫來替代 CSV 或手動數據管理了

把原項目代碼連接數據庫

前面創建的靜態庫(.a 文件)是你程序的“工具箱”,提供操作數據庫的各種 C++ 接口

它只需要被鏈接進你的課設項目;不需要單獨寫代碼去操作它;編譯一次即可,后續只用它就行

手動向 school.db 數據庫插入數據

下載 DB Browser for SQLite(圖形界面,操作簡單,無需寫代碼)

網址:https://sqlitebrowser.org/dl/

我下載的第三個,我看到下面還有個輕便版(portable)的

生成school.db文件

在你的項目運行如下(類似,根據你的需要)代碼

void initDatabase() {// 如果數據庫文件已存在,則跳過創建if (std::filesystem::exists("school.db")) return;try {SQLite::Database db("school.db", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);// 創建 users 表db.exec("CREATE TABLE users (""type TEXT NOT NULL,""id TEXT PRIMARY KEY,""username TEXT,""password TEXT,""phone TEXT,""class TEXT,""major TEXT"");");// 創建 courses 表db.exec("CREATE TABLE courses (""id TEXT PRIMARY KEY,""name TEXT,""time TEXT,""location TEXT,""teacherId TEXT"");");// 創建 student_courses 表db.exec("CREATE TABLE student_courses (""stuId TEXT,""courseId TEXT,""PRIMARY KEY (stuId, courseId)"");");// 創建 student_grades 表db.exec("CREATE TABLE student_grades (""stuId TEXT,""courseId TEXT,""grade INTEGER,""PRIMARY KEY (stuId, courseId)"");");cout << "數據庫和表創建成功。" << std::endl;} catch (const std::exception& e) {cerr << "創建數據庫或表時出錯: " << e.what() << std::endl;}
}

運行后,Code::Blocks 項目所在的目錄下就會生成一個 school.db 文件

向表中插入數據

打開DB Browser for SQLite,點擊左上角,打開school.db

點擊“瀏覽數據”,可以在“表”處選擇要編輯的表格,點擊圖示“插入”

錄入完數據后,點擊“寫入更改”

這個軟件真實太好用了,歡迎大家前去探索實操!!!

補充

嘻嘻,主包已經成了,在現在的AI大環境下其實還是蠻簡單的嘛~

再補充幾個主包操作過程中學習到的東西,是自己的小總結,可能有些不太準確的,歡迎大家前來探討.

通過codeblocks程序向數據庫載入數據,寫入中文時會在數據庫中自動以二進制存儲,再讀取數據時能直接正常顯示中文;但如果直接在數據庫插入數據時寫入中文不能正常顯示(數據庫的字符編碼是utf-8,但codeblocks不是,若自己改動的話輸出框會顯示亂碼,這點codeblocks還是挺不好的‘很多編輯器的字符編碼現在都是utf-8了’)

再來分享幾個數據庫常用簡單操作

數據庫的打開/創建

SQLite::Database db("school.db", SQLite::OPEN_READWRITE | SQLite::OPEN_CREATE);
//SQLite::Database是SQLite C++封裝庫(數據庫文件路徑‘一般當前目錄下’,讀寫|打開模式‘不存在則創建’)

創建表?

db.exec("CREATE TABLE users ("        //CREATE TABLE是SQLite建表語句,定義users表結構"type TEXT NOT NULL,"         //TEXT定義文本類型,NOT NULL表示必填"id TEXT PRIMARY KEY,"        //主鍵(PRIMARY KEY),保證唯一"username TEXT,""password TEXT,""phone TEXT,""class TEXT,""major TEXT"");");

數據庫連接與查詢

SQLite::Statement query(db, "SELECT type, id, username, password, phone, class, major FROM users");    //創建一個SQLite::Statement對象query,執行SQL查詢語句(從users表中選擇type,id…這些列的數據)
while (query.executeStep()) {       //執行查詢并移動到下一行(只要還有下一行就返回true)string type = query.getColumn(0).getString();  //從查詢結果行的第0列獲取字符串類型的數據string id = query.getColumn(1).getString();    //第1列
}

清空表數據

db.exec("DELETE FROM users");  //使用exec方法執行SQL語句DELETE FROM,刪除users表中的所有記錄
SQLite::Statement insert(db, "INSERT INTO users VALUES (?, ?, ?, ?, ?, ?, ?)");   //創建了一個SQLite::Statement對象insert,綁定到db數據庫,并準備了一條插入數據的SQL語句,“?”是占位符
insert.bind(1, u->getUserType());  //使用bind方法將數據綁定到第一個占位符
insert.bind(2, u->getId());        //第二個
insert.bind(3, u->getUsername());
insert.exec();                     //執行插入語句
insert.reset();                    //重置insert語句對象,為下一次插入操作做準備

?好了,拜拜,有些事情好像真的還是不要將就的好,努力努力,學習到了東西,這種充實感其實好像也很不錯~

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

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

相關文章

ArcGIS中對輸入面圖層A的相交問題批量處理的實現方法

一、背景及意義 在各種數據建庫中&#xff0c;拓撲錯誤是必須處理的&#xff0c;其中最常見的是重疊問題&#xff0c;我們常用拓撲工具來檢查重疊&#xff0c;但是由于拓撲工具只能作為檢查且不能批量修改&#xff0c;此時我們可以使用“相交”工具來檢查出重疊部分&#xff0…

【學習筆記】3.3 Decoder-Only PLM

參考資料&#xff1a;https://github.com/datawhalechina/happy-llm Decoder-Only是當前大型語言模型&#xff08;LLM&#xff09;的基礎架構&#xff0c;如 GPT 系列。GPT 是 Decoder-Only 架構的代表&#xff0c;而開源 LLM 如 LLaMA 也是在 GPT 架構基礎上發展而來的。 3…

主流的Attention Backend介紹

Attention Backend 技術背景 注意力&#xff08;Attention&#xff09;機制在深度學習中扮演著關鍵角色&#xff0c;它幫助模型在處理序列數據時&#xff0c;有選擇地關注輸入中的重要信息。然而&#xff0c;傳統的注意力計算往往受到內存訪問和算力分配的雙重制約&#xff0c…

Linux內存取證

我們先把linux取證文件放到kali中&#xff0c;然后這里的Ubuntu18.04-5.4.0-84-generic.zip需要不解壓直接放到vol工具中 然后把Ubuntu18.04-5.4.0-84-generic放到vol工具中&#xff0c;然后開始去這個&#xff0c;使用vol工具查看linux的版本信息 這個LinuxUbuntu18_04-5_4_0-…

使用docx4j 實現word轉pdf(linux亂碼處理)

由于系統之前使用了是itext進行轉換的&#xff0c;現在已經不是開源的工具了&#xff0c;需要收費&#xff0c;然后進行改造&#xff0c;具體處理如下。 <dependency><groupId>org.docx4j</groupId><artifactId>docx4j</artifactId><version…

C++ - vector 的相關練習

目錄 前言 1、題1 只出現一次的數字 &#xff1a; 解法一&#xff1a;遍歷 參考代碼&#xff1a; 解法二&#xff1a;按位異或 參考代碼&#xff1a; 解法三&#xff1a;哈希表 參考代碼&#xff1a; 2、題2 楊輝三角&#xff1a; 參考代碼&#xff1a; 總結 前言 …

JDK 1.8 Stream API:集合流處理深度解析

JDK 1.8 Stream API&#xff1a;集合流處理深度解析 摘要&#xff1a;Stream API 是 JDK 1.8 的革命性特性&#xff0c;它將集合操作從傳統迭代升級為聲明式函數式處理。Stream API三個階段&#xff08;創建→中間操作→終端操作&#xff09;詳解流處理機制&#xff0c;輔以代…

2025學年湖北省職業院校技能大賽 “信息安全管理與評估”賽項 樣題卷(二)

2025學年湖北省職業院校技能大賽 “信息安全管理與評估”賽項 樣題卷&#xff08;二&#xff09; 第一部分&#xff1a;第二部分&#xff1a;網絡安全事件響應、數字取證調查、應用程序安全任務書任務 1&#xff1a;應急響應&#xff08;可以培訓有答案&#xff09;任務 2&…

AiPy實戰(5):效率革命!5分鐘構建行業分析報告

在當今數字化時代&#xff0c;數據呈指數級增長&#xff0c;行業分析報告對于企業的決策制定愈發關鍵。傳統上&#xff0c;撰寫一份行業分析報告&#xff0c;需要分析師耗費大量時間從各類數據庫、新聞資訊平臺、行業報告中手動收集數據&#xff0c;再進行整理、分析和撰寫&…

docker小白自存-windows系統通過docker安裝n8n-nodes-puppeteer

n8n上直接在社區下載puppeteer節點&#xff0c;使用時會報錯說沒有chromium依賴。 找到了n8n-nodes-puppeteer的github試圖解決 根據他的docker安裝指南執行&#xff0c;運行容器時會報exec /docker-custom-entrypoint.sh: no such file or directory &#xff08;明明文件都有…

腳本shebang的作用與使用方法

#!&#xff08;稱為 shebang 或 hashbang&#xff09;是腳本文件開頭的前兩個字符&#xff0c;用于告訴操作系統應該使用哪個解釋器來執行該腳本。 核心作用&#xff1a; 指定解釋器&#xff1a; 明確告訴系統運行這個腳本時應該調用哪個程序&#xff08;解釋器&#xff09;來…

【大模型學習 | BERT 量化學習 (1)】

BERT 情感分析 一、 數據集加載與模型訓練 from transformers import BertTokenizer, BertForSequenceClassification, Trainer, TrainingArguments from datasets import load_dataset import torch import numpy as np from sklearn.metrics import accuracy_score mode_na…

用低通濾波優化串口或485 通信指示燈電路

常見的通信指示燈電路就是簡單的把LED 連到TXD 和RXD 上&#xff0c;一有動靜就閃一下。問題是&#xff0c;如果波特率很高&#xff0c;一次通信時間很短&#xff0c;相當于占空比很低&#xff0c;LED 閃爍的亮度就很弱&#xff0c;不容易觀察。比如MODBUS 通信&#xff0c;波特…

【純干貨】調整word目錄中的行距以及右對齊頁碼

1.問題展現 目錄生成會遇到一些奇葩現象 所以到了展現技術力的時候了【doge】 2.解決word目錄中的行距問題 選中目錄中的文字-》段落 此時你可能勾選了圖片中的一個以上&#xff0c;把他們都取消了&#xff0c; 由于一個目錄的標題對應一個樣式&#xff0c;第一個也可以取消 …

pandas 優雅處理值類型為list的列的csv讀寫問題

文章目錄 直接存儲join list 變成字符串存儲json.dumps序列化存儲以及json.loads反序列化讀取總結 之所以分析這個問題,是因為讀者在跟第三方數據供應商對接數據的時候,老是會遇到數據加載都會出錯的問題,其中一個原因就是list類型數據沒有正確儲存,于是筆者在這篇文章里面詳細…

一種解決 OpenWrt 安裝 docker 之后局域網的設備之間無法互相訪問通信的方法

文章目錄 一、問題背景二、解決方案&#xff08;方法一&#xff09;修改全局設置的 轉發&#xff08; forward&#xff09; 為 接受&#xff08;ACCEPT&#xff09;&#xff08;方法二&#xff09;設置 net.bridge.bridge-nf-call-iptables0 并將 docker 的容器網絡設置為host …

Leetcode百題斬-貪心

貪心也是一個很有意思的專題&#xff0c;能遇到很多神奇的思路。 但這個專題&#xff0c;leetcode也沒放Hard&#xff0c;果然是怕這種玄學專題上點難度大家罩不住。那就很快了&#xff0c;直接過 763. Partition Labels[Medium] 思路&#xff1a;將字母串分組&#xff0c;相…

基于多徑信道的分集接收技術性能優化與仿真分析

基于多徑信道的分集接收技術性能優化與仿真分析 一、多徑信道建模與仿真 1. 多徑信道建模(MATLAB實現) classdef MultipathChannel < handlepropertiesSampleRate = 1e6; % 采樣率 (Hz)MaxDoppler = 100; % 最大多普勒頻移 (Hz)DelayVector = [0

LeetCode 713.乘積小于K的子數組

給你一個整數數組 nums 和一個整數 k &#xff0c;請你返回子數組內所有元素的乘積嚴格小于 k 的連續子數組的數目。 示例 1&#xff1a; 輸入&#xff1a;nums [10,5,2,6], k 100 輸出&#xff1a;8 解釋&#xff1a;8 個乘積小于 100 的子數組分別為&#xff1a;[10]、[5…

打破網絡安全孤島:實現防御數據協作

作者&#xff1a;來自 Elastic Crossley McEwen, Oksana Abramovych 現代網絡戰場不再受組織邊界的限制。在各類防御網絡中&#xff0c;關鍵的結構化、非結構化和半結構化數據分布在不同的專業環境中&#xff0c;形成孤島 —— 從機密情報系統到作戰指揮平臺&#xff0c;再到戰…