sqlite3的使用

sqlite3的使用

splite.hpp

C++ 复制代码
/*
   封装实现一个sqliteHelper类,提供简单的sqlite数据库接口,完成数据的基础增删改查操作
   1.创建/打开数据库
   2.针对打开的数据库进行操作
       1.表的操作
       2.数据的操作
   3.关闭数据库
*/

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

class SqliteHelper
{
    public:
        typedef int(*SqliteCallback)(void*,int ,char**,char**);
        SqliteHelper(const std::string &dbfile):_dbfile(dbfile),_handler(nullptr){}
        bool open(int safe_level=SQLITE_OPEN_FULLMUTEX)
        {
            //int sqlite3_open_v2(const char *filename, sqlite3 **ppDb, int flags, const char *zVfs );
            int ret=sqlite3_open_v2(_dbfile.c_str(),&_handler,SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_level,nullptr);
            if(ret!=SQLITE_OK)
            {
                std::cout<<"创建/打开sqlite数据库失败";
                std::cout<<sqlite3_errmsg(_handler)<<std::endl;
                return false;
            }
            return true;
        }
        bool exec(const std::string &sql,SqliteCallback cb,void *arg)
        {
            //int sqlite3_exec(sqlite3*, char *sql, int (*callback)(void*,int,char**,char**),  void* arg, char **err)
            int ret=sqlite3_exec(_handler,sql.c_str(),cb,arg,nullptr);
            if(ret!=SQLITE_OK)
            {
                std::cout<<sql<<std::endl;
                std::cout<<"执行语句失败!";
                std::cout<<sqlite3_errmsg(_handler)<<std::endl;
                return false;
            }
            return true;
        }
        void close()
        {
           // int sqlite3_close_v2(sqlite3*)
           if(_handler) sqlite3_close_v2(_handler);
        }
    private:
        std::string _dbfile;
        sqlite3* _handler;
};

main.cc

C++ 复制代码
#include "sqlite.hpp"
#include <cassert>

int select_stu_callback(void*arg,int col_count,char**result,char**fields_name)
{
    std::vector<std::string> *arry=(std::vector<std::string>*)arg;
    arry->push_back(result[0]);
    return 0;//必须有!
}
int main()
{
    SqliteHelper helper("./test.db");
    //1.打开/创建库文件
    assert(helper.open());
    //2.创建表,学生信息:学号,姓名,年龄
    const char* ct="create table if not exists student(sn int primary key,name varchar(32),age int)";
    assert(helper.exec(ct,nullptr,nullptr));
    //3.新增数据,删除,修改,查询
    //const char* insert_sql="insert into student values(1,'小明',18),(2,'小黑',19),(3,'小红',18)";
    //assert(helper.exec(insert_sql,nullptr,nullptr));
    //const char *update_sql="update student set name ='张小明' where sn=1";
    //assert(helper.exec(update_sql,nullptr,nullptr));
    //const char *delete_sql="delete from student where sn=3";
    //assert(helper.exec(delete_sql,nullptr,nullptr));
    const char *select_sql="select name from student ;";
    std::vector<std::string> arry;
    assert(helper.exec(select_sql,select_stu_callback,&arry));
    for(auto &name: arry)
    {
        std::cout<<name<<std::endl;
    }
    //4.关闭数据库
    helper.close();
    return 0;
}

makefile

makefile 复制代码
main:main.cc
	g++ -std=c++11 $^ -o $@ -lsqlite3
相关推荐
老三牛擦10 小时前
订单履约流程
jvm
DB哥讲数据库13 小时前
【达梦数据库安装教程】超详细图文讲解-附达梦安装包
数据库·oracle
deepseek2318 小时前
SQLite WAL 开了仍报 database is locked?Python 后台任务的事务与幂等修复
数据库·python·sqlite·并发编程·wal
Aric_Jones21 小时前
WAL / CDC / 复制槽 /位点
数据库·oracle
青春逝如流水1 天前
Java 线程在内存模型(JMM)与 JVM 实现:规范与落地的多元路径
java·开发语言·jvm·多线程·ai文章
细嗅蔷薇@1 天前
排序和分⻚(order by 、limit)
数据库·oracle
梦想平凡1 天前
棋牌游戏技术实战(五):从对局事件重新执行规则,核对棋盘和最终状态
数据库·游戏·oracle
白露与泡影1 天前
Oracle AI Database 26ai RAC 部署步骤、关键命令与一键脚本
数据库·人工智能·oracle
colinu1 天前
C++ 异步任务与线程生命周期:`std::async`、`future`、`thread`、`jthread` 与协作式退出
java·jvm·c++
wuminyu1 天前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++