学习SQLite之路(五) C/C++ SQLite开发实例

  介绍一种乌班图中使用sqlite的用法,非常简单,下面的例子是在乌班图12.04中实现的:

1,先安装两个东西

sudo apt-get install sqlite sqlite3

sudo apt-get install libsqlite3-dev  // 不然可能会报 没有头文件 sqlite3.h

2,C/C++接口:一般用到下面这三个,详情请参考sqlite官方文档。

(1)sqlite3_open(const char *filename, sqlite3 **ppDb)

    打开一个数据库连接, 返回sqlite3对象。

(2)sqlite3_exec(sqlite3*, const char *sql, sqlite_callback, void *data, char **errmsg)

解析并执行由 sql 参数所给的每个命令,直到字符串结束或者遇到错误为止。

(3)sqlite3_close(sqlite3*)

    关闭之前打开的数据库。

3、打开数据库并创建表

#include<stdio.h>
#include<sqlite3.h>

// 暂时先不管
static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i = 0;
    for(i = 0; i < argc; i++)
    {
        printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
    }

    printf("\n");
    return 0;
}

int main()
{
    sqlite3* db;
    char *zErrMsg = 0;
    int rc;
    char *sql;

    rc = sqlite3_open("test.db", &db);  // 打开数据库
    if(rc)
    {
        fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
//        exit(0);
        return -1;
    }
    else
    {
        fprintf(stderr,"open database succeddfully\n");
    }

    sql = "create table company(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE TEXT NOT NULL, ADDRESS CHAR(50))";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg); // 执行上面sql中的命令
    if(SQLITE_OK != rc)
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
    }
    else
    {
        fprintf(stdout, "create table successfully\n");
    }

    sqlite3_close(db);
    return 0;
}

运行:需要链接sqlite3库,下面的其他操作也是如此。

 gcc sqlite3test.c -o create -l sqlite3

4、插入数据:

#include<stdio.h>
#include<sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i = 0;
    for(i = 0; i < argc; i++)
    {
        printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
    }

    printf("\n");
    return 0;
}

int main()
{
    sqlite3* db;
    char *zErrMsg = 0;
    int rc;
    char *sql;

    rc = sqlite3_open("test.db", &db);
    if(rc)
    {
        fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
//        exit(0);
        return -1;
    }
    else
    {
        fprintf(stderr,"open database succeddfully\n");
    }

//    sql = "create table company(ID INT PRIMARY KEY NOT NULL, NAME TEXT NOT NULL, AGE TEXT NOT NULL, ADDRESS CHAR(50))";

    sql = "insert into company(ID, NAME, AGE, ADDRESS) values(1, 'Paul', 25, 'USA');\
        insert into company(ID, NAME, AGE, ADDRESS) values(2, 'James', 28, 'JAP');\
        insert into company(ID, NAME, AGE, ADDRESS) values(3, 'Yao', 30, 'CHA');\
        insert into company(ID, NAME, AGE, ADDRESS) values(4, 'kobe', 38, 'USA');";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if(SQLITE_OK != rc)
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
    }
    else
    {
        fprintf(stdout, "insert table successfully\n");
    }

    sqlite3_close(db);
    return 0;
}

5、查询数据:

注意:这里的callback函数,是sqlite的一个回调函数,格式如下(必须按照这个格式): int sqlite_callback( void* NotUsed,    /* 由 sqlite3_exec() 的第四个参数传递而来 */ int argc,        /* 表的列数 */ char** argv,    /* 指向查询结果的指针数组, 可以由 sqlite3_column_text() 得到 */ char** azColName /* 指向表头名的指针数组, 可以由 sqlite3_column_name() 得到 */ );

执行sqlite3_exec() 时作为参数传进去。

说明:

参数:     NotUsed:由sqlite3_exec传递的初始化参数     argc:表头的列数     azColName:表头的名字数组指针,在我们的例子就是指向{ID, NAME, AGE, ADDRESS}的指针     argv:表头的数据数组指针 返回值:     1:中断查找     0:继续列举查询到的数据

#include<stdio.h>
#include<sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i = 0;
    for(i = 0; i < argc; i++)
    {
        printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
    }

    printf("\n");
    return 0;
}

int main()
{
    sqlite3* db;
    char *zErrMsg = 0;
    int rc;
    char *sql;

    rc = sqlite3_open("test.db", &db);
    if(rc)
    {
        fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
//        exit(0);
        return -1;
    }
    else
    {
        fprintf(stderr,"open database succeddfully\n");
    }

    sql = "select * from  company;";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if(SQLITE_OK != rc)
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
    }
    else
    {
        fprintf(stdout, "select table successfully\n");
    }

    sqlite3_close(db);
    return 0;
}

请看输出:

6、更新并查询:

#include<stdio.h>
#include<sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i = 0;
    for(i = 0; i < argc; i++)
    {
        printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
    }

    printf("\n");
    return 0;
}

int main()
{
    sqlite3* db;
    char *zErrMsg = 0;
    int rc;
    char *sql;

    rc = sqlite3_open("test.db", &db);
    if(rc)
    {
        fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
//        exit(0);
        return -1;
    }
    else
    {
        fprintf(stderr,"open database succeddfully\n");
    }

    sql = "update  company set ADDRESS = 'RUS' where ID = 3;\
        select * from company;";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if(SQLITE_OK != rc)
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
    }
    else
    {
        fprintf(stdout, "update table successfully\n");
    }

    sqlite3_close(db);
    return 0;
}

7、删除并查询:

#include<stdio.h>
#include<sqlite3.h>

static int callback(void *NotUsed, int argc, char **argv, char **azColName)
{
    int i = 0;
    for(i = 0; i < argc; i++)
    {
        printf("%s = %s\n",azColName[i], argv[i]?argv[i]:"NULL");
    }

    printf("\n");
    return 0;
}

int main()
{
    sqlite3* db;
    char *zErrMsg = 0;
    int rc;
    char *sql;

    rc = sqlite3_open("test.db", &db);
    if(rc)
    {
        fprintf(stderr, "Can't open database:%s\n", sqlite3_errmsg(db));
//        exit(0);
        return -1;
    }
    else
    {
        fprintf(stderr,"open database succeddfully\n");
    }

    sql = "delete from company where ID = 2;\
        select * from company;";

    rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);
    if(SQLITE_OK != rc)
    {
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
    }
    else
    {
        fprintf(stdout, "delete table successfully\n");
    }

    sqlite3_close(db);
    return 0;
}

8,上面的例子可在下面找到:

https://github.com/xcywt/MySQLite

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏静晴轩

浅谈android中的目录结构

之前在android游戏开发中就遇到本地数据存储的问题:一般情形之下就将动态数据写入SD中存储,在没有SD卡的手机上就需另作处理了;再有在开发android应用...

34610
来自专栏邹立巍的专栏

Linux 的进程间通信:消息队列

Linux 环境提供了 XSI 和 POSIX 两套消息队列,本文将帮助您掌握以下内容:如何使用 XSI 消息队列,如何使用 POSIX 消息队列,它们的底层实...

7810
来自专栏吴伟祥

文件拷贝工具 原

WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能就是在本地与远程计算机间安全的复制文件。.winsc...

1183
来自专栏CSDN技术头条

一组 Redis 实际应用中的异常场景及其根因分析和解决方案

在上一场 Chat《基于 Redis 的分布式缓存实现方案及可靠性加固策略》中,我已经较为全面的介绍了 Redis 的原理和分布式缓存方案。如果只是从“会用”的...

3633
来自专栏前端说吧

Gulp安装流程、使用方法及cmd常用命令导览

4266
来自专栏技术之路

go微服务框架go-micro深度学习(一) 整体架构介绍

      产品嘴里的一个小项目,从立项到开发上线,随着时间和需求的不断激增,会越来越复杂,变成一个大项目,如果前期项目架构没设计的不好,代码会越来越臃肿,难以...

1.5K3
来自专栏Danny的专栏

【SSH快速进阶】——探索Hibernate对象的三种状态:Transient、Persistent、Detached

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/...

1032
来自专栏aoho求索

基于可靠消息方案的分布式事务(四):接入Lottor服务

在上一篇文章中,通过Lottor Sample介绍了快速体验分布式事务Lottor。本文将会介绍如何将微服务中的生产方和消费方服务接入Lottor。

2751
来自专栏张善友的专栏

分布式文件存储的数据库开源项目MongoDB

MongoDB是一个基于分布式文件存储的数据库开源项目。由C++语言编写。旨在为WEB应用提供可护展的高性能数据存储解决方案。 它的特点是高性能、易部署、易使用...

3539
来自专栏码字搬砖

工作中用到的sh脚本(持续更新)

day=(date−d‘−0day′‘+echo“(date−d‘−0day′‘+echo“(date -d ‘-0 day’ ‘+%Y-%m-%d’) e...

2025

扫码关注云+社区

领取腾讯云代金券