亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SQLite3數(shù)據(jù)庫(kù)的介紹和使用教程(面向業(yè)務(wù)編程-數(shù)據(jù)庫(kù))

 更新時(shí)間:2023年05月04日 08:37:37   作者:'昵稱'undeclared  
這篇文章主要介紹了SQLite3數(shù)據(jù)庫(kù)的介紹和使用(面向業(yè)務(wù)編程-數(shù)據(jù)庫(kù)),本文從SQLite3的庫(kù)的獲取、工程管理、SQL語(yǔ)句介紹、C語(yǔ)言編程四個(gè)角度闡述了SQLite3數(shù)據(jù)庫(kù)的實(shí)際應(yīng)用,需要的朋友可以參考下

SQLite3數(shù)據(jù)庫(kù)的介紹和使用(面向業(yè)務(wù)編程-數(shù)據(jù)庫(kù))

SQLite3介紹

SQLite是一種用C語(yǔ)言實(shí)現(xiàn)的的SQL數(shù)據(jù)庫(kù)

它的特點(diǎn)有:輕量級(jí)、快速、獨(dú)立、高可靠性、跨平臺(tái)

它廣泛應(yīng)用在全世界范圍內(nèi)的手機(jī)電腦應(yīng)用的內(nèi)建數(shù)據(jù)庫(kù)

官網(wǎng)地址:https://www.sqlite.org/index.html

SQLite因?yàn)槠洳捎梦募鎯?chǔ),且容易移植。在嵌入式中應(yīng)用非常廣泛,可以說(shuō)是嵌入式業(yè)務(wù)開(kāi)發(fā)的必學(xué)庫(kù)

這次先講一下怎么獲取源碼和使用

獲取SQLite3源碼

SQLite3的官網(wǎng)是https://www.sqlite.org/download.html

在官網(wǎng)找到sqlite-autoconf-3410200.tar.gz文件下載,如下

wget https://www.sqlite.org/2023/sqlite-autoconf-3410200.tar.gz
tar -zxvf sqlite-autoconf-3410200

下載后解壓,會(huì)發(fā)現(xiàn)里面很多其他的文件。其中,tea目錄是(Tcl Extension Architecture)可以不用管

主要看里面的c文件和h文件,所以我們把源代碼放到另一個(gè)目錄

在工程目錄創(chuàng)建一個(gè)目錄lib/sqlite3,然后刪除解壓后的源碼目錄

cp sqlite-autoconf-3410200/*.c lib/sqlite3/
cp sqlite-autoconf-3410200/*.h lib/sqlite3/
rm -r sqlite-autoconf-3410200

將需要的頭文件和源文件拷貝進(jìn)去

有點(diǎn)強(qiáng)的是sqlite3.c文件的大小居然有8.3M

完成后目錄樹(shù)大概應(yīng)該是這個(gè)樣子的

├── build
├── CMakeLists.txt
├── main.cpp
└── lib
    └── sqlite3
        ├── shell.c
        ├── sqlite3.c
        ├── sqlite3ext.h
        ├── sqlite3.h
        └── sqlite3rc.h

編寫(xiě)CMake工程

其中shell.c是對(duì)應(yīng)的命令行文件,我們可以不用添加。仔細(xì)研讀官網(wǎng)的文檔

https://www.sqlite.org/howtocompile.html

所以CMakeLists.txt我們可以這么寫(xiě)

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(useSQLite LANGUAGES C CXX)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -pthread")
add_executable(useSQLite main.cpp)
# lib sqlite3
include_directories(lib/sqlite3)
add_library(sqlite3
    STATIC
    lib/sqlite3/sqlite3.c)
target_link_libraries(sqlite3 dl)
#
target_link_libraries(useSQLite sqlite3)
# sqlite3-cli
add_executable(SQLite3-cli lib/sqlite3/shell.c)
target_link_libraries(SQLite3-cli sqlite3)

其中關(guān)于添加-ldl選項(xiàng)的步驟參考回答:https://stackoverflow.com/questions/20131138/cmake-add-ldl-at-end-of-link-stage-of-add-library

main.cpp

添加main.cpp文件如下

#include <iostream>
#include <stdio.h>
#include <sqlite3.h>
static int callback(void *NotUsed, int argc, char **argv, char **azColName) {
    int i;
    for (i = 0; i < argc; i++) {
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}
int main(int argc, char **argv) {
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;
    if (argc != 3) {
        fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
        return(1);
    }
    rc = sqlite3_open(argv[1], &db);
    if (rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return(1);
    }
    rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
    if (rc!=SQLITE_OK) {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    sqlite3_close(db);
    return 0;
}

簡(jiǎn)單講一下這個(gè)源碼,其實(shí)就是打開(kāi)一個(gè)數(shù)據(jù)庫(kù)文件執(zhí)行一條指令

看上面的Usage: %s DATABASE SQL-STATEMENT\n就知道,參數(shù)是帶引號(hào)的SQL語(yǔ)句

里面調(diào)用了三個(gè)庫(kù)函數(shù)sqlite3_open()、sqlite3_exec()sqlite3_close()

分別是打開(kāi)SQLite數(shù)據(jù)庫(kù)文件,執(zhí)行第二個(gè)參數(shù)給的命令,關(guān)閉SQLite數(shù)據(jù)庫(kù)文件

因?yàn)镾QLite是本地文件存儲(chǔ)和讀寫(xiě)的,所以使用起來(lái)還是比較簡(jiǎn)單的,不用考慮太多網(wǎng)絡(luò)的問(wèn)題。

編譯

mkdir build && cd build
cmake .. && make

編譯出來(lái)有兩個(gè)可執(zhí)行文件,一個(gè)是useSQLite一個(gè)是SQLite3-cli。

useSQLite就是我們上面說(shuō)的main.cpp的內(nèi)容。

SQLite3-cli是官方給的一個(gè)命令行執(zhí)行SQL的程序,可以用它去查一些數(shù)據(jù)什么的

但是不是很建議用這個(gè),建議用Ubuntu安裝的SQLite3去做查表操作,回退(刪除)比這個(gè)方便些(下面一節(jié)介紹怎么安裝)

使用SQL

本文為作者原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處:https://www.cnblogs.com/nbtech/p/use_sqlite_library.html

那么都叫SQLite了,肯定是支持SQL語(yǔ)句的,所以使用SQLite,肯定要懂一些SQL。

這里需要注意的是SQLite中的SQL和其他數(shù)據(jù)庫(kù)的SQL有所區(qū)別,使用的時(shí)候需要小心。本文只講SQLite的SQL

不過(guò)也并不用太擔(dān)心,差異不是很大

那么這里簡(jiǎn)單講兩個(gè)SQL語(yǔ)句

因?yàn)橹皇呛?jiǎn)單的介紹文,所以不會(huì)說(shuō)的很詳細(xì)

安裝一個(gè)SQLite3

我們?yōu)榱朔奖憔毩?xí),可以直接在Ubuntu下安裝一個(gè)SQLite3程序

sudo apt install sqlite3

那么簡(jiǎn)單創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)可以這樣

sqlite3 mydatabase.db

mydatabase.db是數(shù)據(jù)庫(kù)的名字,這樣打開(kāi)之后,就可以執(zhí)行后面的SQL語(yǔ)句了

不過(guò)也可以拿到shell.c編譯出來(lái)的SQLite3-cli(這個(gè)比較難用,不過(guò)也夠用)

建表

首先,數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)有關(guān)系型數(shù)據(jù)庫(kù)(SQL)和非關(guān)系型(NoSQL),那么SQLite是屬于 關(guān)系型的數(shù)據(jù)庫(kù)

關(guān)系型的數(shù)據(jù)庫(kù)呢,一個(gè)特點(diǎn)就是它比較的結(jié)構(gòu)化。結(jié)構(gòu)化存儲(chǔ),就是里面存放東西都是相同結(jié)構(gòu)的,那么相同結(jié)構(gòu)的東西呢就放在一個(gè)表里面。

類似于書(shū)架上的書(shū)籍,整理的時(shí)候會(huì)將同一類型的書(shū)籍放到一個(gè)書(shū)架上面

那么先建立一個(gè)書(shū)架,咳咳,建表

CREATE TABLE IF NOT EXISTS mytable (id integer primary key,name text);

上面語(yǔ)句可以建表,建表前會(huì)判斷表是不是已經(jīng)存在,也可以不去判斷,如下

CREATE TABLE yourtable (id integer primary key, name text, age integer);

primary key表示將該字段設(shè)置成主鍵

注意:語(yǔ)句結(jié)束需要由;(分號(hào))進(jìn)行結(jié)尾,表示這一句SQL結(jié)束了,SQLite可以執(zhí)行了

那么新建的這張表有兩個(gè)字段,一個(gè)是id,一個(gè)是name。id字段的類型是integer整形,就是整數(shù)類型,就是0、1、2這些

name字段是text類型,就是文本類型,例如,"zhangsan"或者 "張三"就是文字類型

除了設(shè)置主鍵約束,還可以設(shè)置唯一約束。SQLite里面設(shè)置唯一只需要在字段后面加上一個(gè)unique即可

例如在上面name text 改成name text unique

插入行

類比我們往書(shū)架上放一本書(shū)

數(shù)據(jù)庫(kù),就是存放數(shù)據(jù)的一個(gè)地方。數(shù)據(jù)倉(cāng)庫(kù)。

現(xiàn)在庫(kù)已經(jīng)有了(已經(jīng)建好表了),那么就可以存入結(jié)構(gòu)化的數(shù)據(jù)了。

在一張表中插入一行數(shù)據(jù)的操作很簡(jiǎn)單,只需要

INSERT INTO mytable (id,name) values (1000, "zhangsan");

注意上面這個(gè)zhangsan要用引號(hào)括起來(lái),表示這是一個(gè)字符串(前面的1000因?yàn)槭菙?shù)字所以不用括號(hào))

INSERT INTO表示插入到,mytable指定對(duì)應(yīng)的表,所以上面語(yǔ)句表示向mytable這張表插入一行數(shù)據(jù),數(shù)據(jù)內(nèi)容就是

id是1000,name是"zhangsan"的一行數(shù)據(jù)

非常容易理解

重復(fù)值:如果我們想嘗試往里面插入相同的id的行,就是報(bào)錯(cuò),因?yàn)閕d是主鍵,主鍵是不允許重復(fù)的。但是插入相同的非主鍵的值是被允許的。

INSERT INTO mytable (id, name) values (1000, "lisi");
Runtime error: UNIQUE constraint failed: mytable.id (19)

查找數(shù)據(jù)

可以類比我們從書(shū)架上挑選感興趣的書(shū),例如找兩本比較厚的書(shū)

如果我們想查找一張表里面的所有數(shù)據(jù),如下

SELECT * FROM mytable;

*表示匹配所有項(xiàng),F(xiàn)ROM表示從mytable中,SELECT表示選擇

所以就是:從mytable表中選擇所有項(xiàng)

過(guò)濾結(jié)果

但是如果我們想從表中獲取特定的項(xiàng)呢,我們可以搭配WHERE,例如,我們想提取id大于1000的數(shù)據(jù),可以這么寫(xiě)

SELECT * FROM mytable WHERE id > 1000;

例如我們的表數(shù)據(jù)內(nèi)容如下

1000|zhangsan
1001|lisi
1002|wangwu

可以獲取這樣的結(jié)果

1001|lisi
1002|wangwu

刪除一項(xiàng)數(shù)據(jù)

可以類比我們從書(shū)架上拿下一本書(shū),這本書(shū)不存放到這個(gè)書(shū)架了

DELETE就是刪除,那么刪除一條數(shù)據(jù)就是要指定是哪個(gè)表的那條數(shù)據(jù),可以這么寫(xiě)

DELETE FROM mytable WHERE id=1001; 

就可以刪除id為1001的數(shù)據(jù)了,WHERE就是用來(lái)指定條件的,一般我們DELETE都是需要搭配WHERE使用,因?yàn)橥ǔJ且獎(jiǎng)h除一條或幾條數(shù)據(jù)。

那么如果不加WHERE,就是刪除表上的所有數(shù)據(jù)(注意,只是刪除表里面的所有記錄,表還是在的)

DELETE FROM mytable;

多條件

有時(shí)候我們需要?jiǎng)h除符合多個(gè)條件的數(shù)據(jù),我們可以用AND將兩個(gè)語(yǔ)句連接起來(lái)

例如說(shuō),需要?jiǎng)h除age字段大于35的并且id字段小于1000的,可以這么寫(xiě)

DELETE FROM yourtable WHERE id<1000 AND age>35;

如果我們想修改一項(xiàng)數(shù)據(jù),例如想將id為1000的"zhangsan"修改成"zhansang"

我們可以刪除id為1000的數(shù)據(jù)然后插入id為1000但是name字段為"zhansang"的數(shù)據(jù),但是我們可以不必這么做,我們可以更新值

更新字段

這個(gè)不好類比書(shū)架了,可以類比于拿下一本書(shū)換了一本上去吧

更新字段的值,首先要知道是那個(gè)字段,所以一定有WHERE語(yǔ)句,然后更新是UPDATE,所以更新字段的語(yǔ)句就是

UPDATE mytable SET name="zhansang" WHERE name="zhangsan";

當(dāng)然條件的字段和SET的字段不一定要同一個(gè)字段,例如條件可以是id<1000,SET后面可以name="zhansang"類似這樣,就可以將所有id小于1000的name都更新成"zhansang"了

SQL總結(jié)

SQL數(shù)據(jù)庫(kù)的應(yīng)用非常廣泛,包括數(shù)據(jù)采集、數(shù)據(jù)分析、單純的存取數(shù)據(jù)。

SQL是非常好用的數(shù)據(jù)庫(kù)查詢語(yǔ)言,并且它不復(fù)雜,比較容易懂。而且專業(yè)做SQL的人工資也不低(前提是就是靠這個(gè)吃飯的哈)。

學(xué)好SQL無(wú)論是對(duì)實(shí)用性還是經(jīng)濟(jì)性來(lái)說(shuō)都是非常好的,寫(xiě)SQL有點(diǎn)像搭積木,想要什么就搭建成什么樣。

C語(yǔ)言編程

在前面編譯CMake工程中其實(shí)就有編譯出使用SQLite進(jìn)行C語(yǔ)言編程的源碼

里面main.cpp里面主要用到3個(gè)Sqlite3里面的函數(shù),分別是sqlite3_open、sqlite3_exec和sqlite3_close

非常簡(jiǎn)單,三個(gè)函數(shù)分別是

sqlite3_open表示打開(kāi)一個(gè)數(shù)據(jù)庫(kù)文件,一般為xxx.db

sqlite3_exec表示執(zhí)行一條SQL語(yǔ)句

sqlite3_close表示關(guān)閉數(shù)據(jù)庫(kù)文件

打開(kāi)和關(guān)閉一個(gè)數(shù)據(jù)庫(kù)文件

打開(kāi)一個(gè)數(shù)據(jù)庫(kù)文件

首先,先編寫(xiě)如下代碼

int opendatabase(sqlite3** db, const char* dbfilename) {
    char *zErrMsg = 0;
    int rc;
    rc = sqlite3_open(dbfilename, db);
    if(SQLITE_OK != rc) {
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(*db));
        sqlite3_close(*db);
        return -1;
    }
    return 0;
}

上面打開(kāi)一個(gè)名為mydatabase.db的數(shù)據(jù)庫(kù),db為該數(shù)據(jù)庫(kù)的句柄

然后判斷有沒(méi)有錯(cuò)誤(一般在指定文件不是一個(gè)數(shù)據(jù)庫(kù)文件會(huì)報(bào)錯(cuò)),如果沒(méi)有指定的數(shù)據(jù)庫(kù)文件會(huì)自動(dòng)創(chuàng)建。

關(guān)閉一個(gè)數(shù)據(jù)庫(kù)句柄

關(guān)閉一個(gè)數(shù)據(jù)庫(kù)文件可以直接調(diào)用sqlite3_close(sqlite3* db);也可以自己封裝一個(gè)函數(shù),如下

int clsoedb(sqlite3** db) {
    if(NULL != *db) {
        sqlite3_close(*db);
        return 0;
    }
    return -1;
}

執(zhí)行SQLite語(yǔ)句

本文為作者原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明出處:https://www.cnblogs.com/nbtech/p/use_sqlite_library.html

因?yàn)榭梢詧?zhí)行的語(yǔ)句特別多,而且上面章節(jié)也講過(guò)有關(guān)SQLite語(yǔ)句的一些介紹,所以這里主要講sqlite3_exec這個(gè)C語(yǔ)言接口

先看一下源碼實(shí)現(xiàn)

SQLITE_API int sqlite3_exec(
  sqlite3 *db,                /* The database on which the SQL executes */
  const char *zSql,           /* The SQL to be executed */
  sqlite3_callback xCallback, /* Invoke this callback routine */
  void *pArg,                 /* First argument to xCallback() */
  char **pzErrMsg             /* Write error messages here */
){

第一個(gè)參數(shù)是數(shù)據(jù)庫(kù)的句柄,用于操作數(shù)據(jù)庫(kù)用的。

第二個(gè)參數(shù)是傳遞給SQLite執(zhí)行的SQL語(yǔ)句

第三個(gè)參數(shù)是執(zhí)行后的回調(diào)函數(shù)

第四個(gè)參數(shù)是回調(diào)函數(shù)的第一個(gè)參

第五個(gè)參數(shù)是如果執(zhí)行語(yǔ)句錯(cuò)誤,用于返回錯(cuò)誤信息的字符串指針

那么第三個(gè)參數(shù)和第四個(gè)參數(shù)可以根據(jù)需要置為空或者給一個(gè)函數(shù)指針和一片內(nèi)存(通常第四個(gè)參數(shù)用來(lái)返回執(zhí)行后的結(jié)果)

不帶回調(diào)

不需要回調(diào)的示例,參考如下代碼

//創(chuàng)建表
int create_table(sqlite3 *pdb) {
    char *sql = NULL;
    char *errmsg = NULL;
    int ret;
    sql = (char*)"create table if not exists mytable (id integer primary key,name text);";
    ret = sqlite3_exec(pdb, sql, NULL, NULL, &errmsg);
    if(SQLITE_OK != ret) {
        printf("create table error! %s\n", errmsg);
        return -1;
    } else {
        return 0;
    }
}

上面的sql的值就是建表的一個(gè)操作,可以參考上面SQL語(yǔ)句的相關(guān)介紹。因?yàn)榻ū聿僮魑覀冎恍枰澜ū沓晒α诉€是失敗了,所以我們不需要填充xCallback和pArg參數(shù),自然填NULL的時(shí)候不會(huì)調(diào)用到回調(diào)

帶回調(diào)

需要調(diào)用回調(diào)的示例,參考如下代碼

// callback
int show_row(void *return_, int column, char* result[], char** column_name) {
    for(int i = 0; i < column; i++) {
        printf("%s\t", result[i]);
    }
    printf("\n");
    return 0;
}
// 查詢和顯示所有mytable的數(shù)據(jù)
int query_all_and_show(sqlite3* pdb) {
    char sql[24] = {0};
    char *errmsg = NULL;
    int ret;
    strncpy(sql, "select * from mytable;", 22);
    // 數(shù)據(jù)庫(kù),語(yǔ)句字符串,回調(diào)函數(shù),用戶輸入的參數(shù),最終傳給回調(diào)函數(shù)使用,錯(cuò)誤信息
    ret = sqlite3_exec(pdb, sql, show_row, NULL, &errmsg);
    if(SQLITE_OK != ret) {
        printf("select exec error: %s\n", errmsg);
        return -1;
    }
    return 0;
}

上述代碼查詢了當(dāng)前mytable表里面的所有行的數(shù)據(jù),上面的會(huì)調(diào)函數(shù)當(dāng)有多行的時(shí)候會(huì)調(diào)用多次。每一次都可以將一行的數(shù)據(jù)打印出來(lái)

如果需要將表返回到主函數(shù),可以在pArg參數(shù)那里填充一個(gè)結(jié)構(gòu)體鏈表指針(或者vector),然后每次創(chuàng)建一項(xiàng)就可以返回整張表的內(nèi)容。

sqlite3_get_table

除了sqlite3_exec()函數(shù),SQLite3還提供了一個(gè)函數(shù)可以執(zhí)行語(yǔ)句,并且可以在同一個(gè)函數(shù)中處理返回的數(shù)據(jù),像上述的查表的操作其實(shí)用這個(gè)函數(shù)會(huì)更好一點(diǎn)

SQLITE_API int sqlite3_get_table(
  sqlite3 *db,                /* The database on which the SQL executes */
  const char *zSql,           /* The SQL to be executed */
  char ***pazResult,          /* Write the result table here */
  int *pnRow,                 /* Write the number of rows in the result here */
  int *pnColumn,              /* Write the number of columns of result here */
  char **pzErrMsg             /* Write error messages here */
){

同樣的,我們看下參數(shù),第一個(gè)參數(shù)是數(shù)據(jù)庫(kù)句柄,第二個(gè)參數(shù)是需要執(zhí)行的SQL語(yǔ)句

第三個(gè)參數(shù)是返回的結(jié)果的表

第四個(gè)參數(shù)是一共有多少行

第五個(gè)參數(shù)是一共有多少列

第六個(gè)參數(shù)是產(chǎn)生錯(cuò)誤時(shí)的錯(cuò)誤信息返回

這里不講具體的寫(xiě)法了,輸出行列值可以參考以下寫(xiě)法

for(int i = 0; i < Col; i++) {
    for(int j = 0; j < Row; j++) {
       printf("%s\t", azResult[i*Row+j]);
    }
    printf("\n");
}

SQLitecpp

SQLiteC++是一個(gè)簡(jiǎn)潔易用的C++封裝庫(kù)

正常我們用C語(yǔ)言去編程,可以像上面章節(jié)說(shuō)的,自己去封裝相關(guān)的操作。如果你的項(xiàng)目用上了C++,那么我推薦用C++封裝的庫(kù)去寫(xiě),會(huì)比較方便一點(diǎn)。

源文件

上面C語(yǔ)言編程的章節(jié),介紹了相關(guān)操作數(shù)據(jù)庫(kù)的流程,這里不再重復(fù)介紹

我們看下使用SQLiteC++最簡(jiǎn)單的示例是怎么樣的,首先SQLiteC++的源碼在:https://github.com/SRombauts/SQLiteCpp

我們可以創(chuàng)建一個(gè)工程,然后獲取SQLiteC++的源碼

mkdir useSQLiteCpp && cd useSQLiteCpp
git clone https://github.com/SRombauts/SQLiteCpp.git
cd SQLiteCpp
git submodule init
git submodule update

在examples/example2/src路徑下有一個(gè)示例的main.cpp,我們可以通過(guò)觀察這個(gè)文件學(xué)習(xí)SQLiteC++庫(kù)的相關(guān)操作,在useSQLiteCpp目錄創(chuàng)建main.cpp,內(nèi)容如下

#include <iostream>
#include "SQLiteCpp/SQLiteCpp.h"
// https://www.cnblogs.com/nbtech/p/use_sqlite_library.html
int main() {
    try
    {
        // Open a database file in create/write mode(用寫(xiě)模式打開(kāi)一個(gè)數(shù)據(jù)庫(kù)文件)
        SQLite::Database    db("test.db3", SQLite::OPEN_READWRITE|SQLite::OPEN_CREATE);
        std::cout << "SQLite database file '" << db.getFilename().c_str() << "' opened successfully\n";
        // Create a new table with an explicit "id" column aliasing the underlying rowid(創(chuàng)建一個(gè)表,id設(shè)置為主鍵)
        db.exec("DROP TABLE IF EXISTS test");
        db.exec("CREATE TABLE test (id INTEGER PRIMARY KEY, value TEXT)");
        // first row(插入一行,id是NULL就是不指定,不指定會(huì)從1開(kāi)始分配,value是test)
        int nb = db.exec("INSERT INTO test VALUES (NULL, \"test\")");
        std::cout << "INSERT INTO test VALUES (NULL, \"test\")\", returned " << nb << std::endl;
        // second row(插入第二行,id是2,根據(jù)上一條記錄加一,value是second)
        nb = db.exec("INSERT INTO test VALUES (NULL, \"second\")");
        std::cout << "INSERT INTO test VALUES (NULL, \"second\")\", returned " << nb << std::endl;
        // update the second row(將id為2的行的value值更新為second-updated)
        nb = db.exec("UPDATE test SET value=\"second-updated\" WHERE id='2'");
        std::cout << "UPDATE test SET value=\"second-updated\" WHERE id='2', returned " << nb << std::endl;
        // Check the results : expect two row of result(讀取結(jié)果,應(yīng)該會(huì)有兩行數(shù)據(jù)。其實(shí)就是查表)
        SQLite::Statement   query(db, "SELECT * FROM test");
        std::cout << "SELECT * FROM test :\n";
        while (query.executeStep())
        {
            std::cout << "row (" << query.getColumn(0) << ", \"" << query.getColumn(1) << "\")\n";
        }
        db.exec("DROP TABLE test"); // 刪除test這個(gè)表
    }
    catch (std::exception& e)
    { // 異常處理
        std::cout << "SQLite exception: " << e.what() << std::endl;
        return EXIT_FAILURE; // unexpected error : exit the example program
    }
    // remove("test.db3"); // 刪除文件
    return 0;
}

上面的幾個(gè)操作總結(jié)就是:

1、聲明一個(gè)db文件,以什么形式打開(kāi)SQLite::Database db("test.db3", SQLite::OPEN_READWRITE|SQLite::OPEN_CREATE);

2、通過(guò)exec方法執(zhí)行各種SQL語(yǔ)句,db.exec(const char* );

3、定義查詢語(yǔ)句,并獲取結(jié)果SQLite::Statement query(db, "SELECT * FROM test");

4、異常處理

根據(jù)上面的注釋內(nèi)容可以知道這個(gè)main.cpp做了哪些事情

編寫(xiě)CMake工程

編寫(xiě)CMake工程也比較簡(jiǎn)單,SQLiteC++是通過(guò)CMake管理的,所以添加為子項(xiàng)目即可

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(useSQLiteCpp LANGUAGES CXX)
add_executable(useSQLiteCpp main.cpp)
# SQLiteCpp
include_directories(SQLiteCpp/include)
option(SQLITECPP_RUN_CPPLINT "Not Run cpplint.py tool for Google C++ StyleGuide." OFF)
add_subdirectory(SQLiteCpp lib)
target_link_libraries(useSQLiteCpp SQLiteCpp)

編譯就不描述了

總結(jié)

數(shù)據(jù)庫(kù)在業(yè)務(wù)開(kāi)發(fā)中是非常常見(jiàn)的,而SQLite3被廣泛應(yīng)用在各個(gè)領(lǐng)域。并且由于它的小型無(wú)服務(wù)器結(jié)構(gòu)并且依靠文件存儲(chǔ),也被廣泛應(yīng)用在各種嵌入式系統(tǒng)中

所以說(shuō),了解SQLite3幾乎是從事嵌入式業(yè)務(wù)開(kāi)發(fā)的必選項(xiàng)

本文從SQLite3的庫(kù)的獲取、工程管理、SQL語(yǔ)句介紹、C語(yǔ)言編程四個(gè)角度闡述了SQLite3數(shù)據(jù)庫(kù)的實(shí)際應(yīng)用。希望對(duì)你的數(shù)據(jù)收集、數(shù)據(jù)管理有一定的啟蒙作用。

but, not yet

相信這對(duì)你只是一個(gè)開(kāi)始,當(dāng)前時(shí)代是信息的時(shí)代,我們需要的數(shù)據(jù)越來(lái)越龐大,大數(shù)據(jù)在生活的各個(gè)角落起著越來(lái)越重要的作用。

在各種高并發(fā)、大流量的場(chǎng)景下,SQLite3還是不夠用。我們不能停下腳步,我們的目標(biāo)是星辰大海。

到此這篇關(guān)于SQLite3數(shù)據(jù)庫(kù)的介紹和使用(面向業(yè)務(wù)編程-數(shù)據(jù)庫(kù))的文章就介紹到這了,更多相關(guān)SQLite3介紹和使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論