C++: 使用 sqlite3(callback回调方式)

3 篇文章 1 订阅

一、使用 yum 安装 sqlite-devel

yum install -y sqlite-devel

二、使用 sqlite的c++代码

头文件 SqliteKV.h

#ifndef SQLITEORM_H_

#include <string>
#include <sqlite3.h>

class SqliteKV {
public:
    struct Res
    {
        int cnt;
        std::string s;
    };

    SqliteKV();
    ~SqliteKV();

    bool Set(const std::string& key, const std::string& value);
    std::string Get(const std::string& key);
    bool Delete(const std::string& key);
    static int Callback(void *args, int argc, char **argv, char **azColName);

private:
    sqlite3 *db_;
};

#endif

cpp 文件 SqliteKV.cpp

#include <iostream>
#include <cstring>
#include <string>
#include <SqliteKV.h>

SqliteKV::SqliteKV() {
    auto ret = sqlite3_open("sqlitekv.db", &db_);
    if(ret != SQLITE_OK)
    {
        db_ = nullptr;
        return;
    }

    std::string sql = "create table if not exists kv (ID INTEGER PRIMARY KEY AUTOINCREMENT, key TEXT NOT NULL UNIQUE ON CONFLICT REPLACE, VALUE TEXT);";

    char *zErrMsg = NULL;
    ret = sqlite3_exec(db_, sql.data(), NULL, 0, &zErrMsg);
    if(ret != SQLITE_OK)
    {
        std::cout << "create kv table faild" << std::endl;
    }
    else
    {
        std::cout << "create kv table success" << std::endl;
    }
    sqlite3_free(zErrMsg);
}

SqliteKV::~SqliteKV() {
    if(nullptr != db_) {
        sqlite3_close(db_);
        db_ = nullptr;
    }
}

bool SqliteKV::Set(const std::string& key, const std::string& value) {
    char sql[1024] = {0};
    snprintf(sql, sizeof(sql), "insert into kv (key, VALUE) VALUES ('%s', '%s') ;", key.data(), value.data());

    char *zErrMsg = NULL;
    int r = sqlite3_exec(db_, sql, NULL, 0, &zErrMsg); //不需要 callback
    if (r != SQLITE_OK)
    {   
        std::cout << "sqlite3_exec error when set table :" <<  zErrMsg << std::endl;
        sqlite3_free(zErrMsg);
        return false; 
    }   
    sqlite3_free(zErrMsg);

    return true;

}

std::string SqliteKV::Get(const std::string& key) {
    char sql[1024] = {0};
    snprintf(sql, sizeof(sql), "select VALUE from kv where key = '%s'; ", key.data());

    struct Res res = {0, ""};
    char *zErrMsg = NULL;
    int r = sqlite3_exec(db_, sql, SqliteKV::Callback, &res, &zErrMsg);
    if(r != SQLITE_OK)
    {
        std::cout << "sqlite3_exec error : " << zErrMsg << std::endl;
    }
    sqlite3_free(zErrMsg);

    if(res.cnt <= 0)
    {
        return "";
    }
    else
    {
        return res.s;
    }
}

bool SqliteKV::Delete(const std::string& key) {
    char sql[1024] = {0};
    snprintf(sql, sizeof(sql), "delete from kv where key = '%s';", key.data());

    char *zErrMsg = NULL;
    int r = sqlite3_exec(db_, sql, NULL, 0, &zErrMsg);
    if (r != SQLITE_OK)
    {   
        std::cout << "sqlite3_exec error when Delete from table" <<  zErrMsg << std::endl;
        sqlite3_free(zErrMsg);
        return false; 
    }   
    sqlite3_free(zErrMsg);

    return true;
}

int SqliteKV::Callback(void *args, int argc, char **argv, char **azColName) {
    struct Res* res = (struct Res*)args;
    res -> cnt ++;
    res -> s = argv[0];

    return 0;
}

main 文件 main.cpp

#include <iostream>
#include <SqliteKV.h>

int main() {
    auto obj = SqliteKV();
    obj.Set("hello", "world");

    std::cout << "key: hello" << obj.Get("hello") << std::endl;
    std::cout << "key: not-exists" << obj.Get("not-exists") << std::endl;

    return 0;
}

三、编译及运行

编译:

g++ -o main -I./ -lsqlite3 main.cpp SqliteKV.cpp

运行:

$ ./main 
create kv table success
key: helloworld
key: not-exists

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
我很乐意回答您的问题。下面是一个简单的SQLite3示例程序,它展示了如何在C语言中使用SQLite3库进行数据库操作: ```c #include <stdio.h> #include <stdlib.h> #include <sqlite3.h> // 回调函数 static int callback(void *data, 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; const char *sql; // 打开数据库 rc = sqlite3_open("test.db", &db); if(rc) { fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db)); sqlite3_close(db); exit(1); } // 创建表 sql = "CREATE TABLE COMPANY(" "ID INT PRIMARY KEY NOT NULL," "NAME TEXT NOT NULL," "AGE INT NOT NULL," "ADDRESS CHAR(50)," "SALARY REAL);"; rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if(rc != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Table created successfully\n"); } // 插入数据 sql = "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " "VALUES (1, 'Paul', 32, 'California', 20000.00 ); " "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) " "VALUES (2, 'Allen', 25, 'Texas', 15000.00 ); " "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" "VALUES (3, 'Teddy', 23, 'Norway', 20000.00 );" "INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY)" "VALUES (4, 'Mark', 25, 'Rich-Mond', 65000.00 );"; rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if(rc != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Records created successfully\n"); } // 查询数据 sql = "SELECT * from COMPANY"; rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); if(rc != SQLITE_OK) { fprintf(stderr, "SQL error: %s\n", zErrMsg); sqlite3_free(zErrMsg); } else { fprintf(stdout, "Operation done successfully\n"); } // 关闭数据库 sqlite3_close(db); return 0; } ``` 以上示例程序将创建名为"test.db"的SQLite3数据库,并在其中创建一个名为"COMPANY"的表。然后,它会向表中插入一些数据,并查询该表以显示结果。为了运行此程序,您将需要安装SQLite3库并编译上述代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值