Sqlite-3 小结

版权声明:转发注明出处,共同学习共同进步,感谢支持。 https://blog.csdn.net/AMDDMA/article/details/81838834

一、sqlite3详细介绍

       sqlite学习网址:http://www.runoob.com/sqlite/sqlite-tutorial.html

       sqlite开源源码下载地址:https://www.sqlite.org/download.html

       使用量超越sqlite的开源内存数据库系统:redis

       redis学习网址:http://www.runoob.com/redis/redis-intro.html

      redis开源源码下载地址:http://www.redis.cn/download.html

      sqlite数据库涉及的最基本的知识:

二、sqlite3在qt中的使用

      2.1、C语言写的丑到爆的接口

#include <stdio.h>
#include <string.h>
/* 编译时要加'-lpthread' */

#include "sqlite3.h"
#include "sqlite_interface.h"

/*************基本数据类型定义***************/
typedef unsigned int UINT32;
typedef unsigned char UINT8;
typedef unsigned short UINT16;
typedef unsigned long long UINT64;/* 32bit机器long为32bits */
typedef int INT32;

/**********************错误码定义(应在公共头文件中)*********************/
#define ALL_OK                             0
#define ERR_CODE_RETURN_FAILED             -1 
#define ERR_CODE_BASES                     10
#define ERR_CODE_DATA_BASE_NAME_NULL         (ERR_CODE_BASES+1)
#define ERR_CODE_DATA_BASE_CREATE_FAILED     (ERR_CODE_BASES+2)
#define ERR_CODE_DATA_BASE_ALREADY_EXIST     (ERR_CODE_BASES+3)
#define ERR_CODE_DATA_BASE_DB_CLOSED         (ERR_CODE_BASES+4)
#define ERR_CODE_DATA_BASE_CLOSE_FAILED      (ERR_CODE_BASES+5)
#define ERR_CODE_DATA_BASE_INPUT_NULL        (ERR_CODE_BASES+6)
#define ERR_CODE_DATA_BASE_EXEC_DB_ERR       (ERR_CODE_BASES+7)
#define ERR_CODE_DATA_BASE_EXEC_FAILED       (ERR_CODE_BASES+8)
#define ERR_CODE_DATA_BASE_GET_TABLE_FAILED  (ERR_CODE_BASES+9)

/***************全局变量定义****************/
struct sqlite3 *data_base_test = NULL;
/*该结构体在sqlite3.c文件的Line:9931,version:3.7.16.1*/

/******************************************
* 函数名:sqlite_interface_init_db
* 功能:初始化数据库
* 描述:创建数据库文件,命名由传参设定
* 入参描述
* 类型        名称         输入/输出      注
* char*   db_file_name       IN       长度限制
* 返回值:相关错误码
* 函数类型:外部可调用
*******************************************/ 
INT32 sqlite_interface_init_database(char *db_file_name)
{
    INT32 lRet;
    /* 检查入参 */
    if ( (NULL == db_file_name) || strlen(pDBName) <= 0)
    {
        printf("input data base name is NULL!\n");
        return ERR_CODE_DATA_BASE_NAME_NULL;
    }
    if (NULL != data_base_test)
    {
        printf("There alerady had data_base file!\n");
        return ERR_CODE_DATA_BASE_ALREADY_EXIST;
    }
    
   
    lRet = sqlite3_open((const char *)pDBName,&data_base_test);
                                /* sqlite3_open相关定义在sqlite3.c Line:3312 */
    if(ALL_OK != lRet)
    {
      printf("Create data base file failed! Return:%d\n",lRet);
      return ERR_CODE_DATA_BASE_CREATE_FAILED;
    }

    return ALL_OK;
}

/******************************************
* 函数名:sqlite_interface_close_db
* 功能:关闭数据库文件、缓存
* 描述:
* 入参描述
* 类型        名称         输入/输出      注
* 无
* 返回值:相关错误码
* 函数类型:外部可调用
*******************************************/ 
INT32 sqlite_interface_close_db()
{
    if(NULL == data_base_test)
    {
        printf("Data base not exist or already closed!\n");
        return ERR_CODE_DATA_BASE_DB_CLOSED;
    }
  
    if(ALL_OK != sqlite_close(data_base_test))
    {
         printf("Close DB Failed,Someone using or file not exist!\n");  
         return ERR_CODE_DATA_BASE_CLOSE_FAILED; 
    }
    else
    {
        data_base_test = NULL;
        printf("Close Data Base OK!\n");
        return ALL_OK;
    }

}

/******************************************
* 函数名:sqlite_interface_exec_db_statement
* 功能:执行sqlite3数据库语句,实现数据插入、删除等操作
* 描述:
* 入参描述
* 类型        名称         输入/输出      注
* char*      cmd_src         IN       长度限制
* 返回值:相关错误码
* 函数类型:外部可调用
*******************************************/ 
INT32 sqlite_interface_exec_db_statement(char *cmd_src)
{
    INT32 lRet = ALL_OK;
    char* exec_msg = NULL;

    if( (NULL == cmd_src) || \
        (strlen(cmd_src) <= 0) ||)
    {
        printf("execute statement error,input para:cmd:%s length:%d\n",cmd_src,strlen(cmd_src));
        return ERR_CODE_DATA_BASE_INPUT_NULL;
    }
    if(NULL == data_base_test)
    {
        printf("Data base not exist or already closed!\n");
        return ERR_CODE_DATA_BASE_EXEC_DB_ERR;
    }
    

    lRet = sqlite3_exec(data_base_test,cmd_src, 0, 0,&exec_msg);
    if(ALL_OK != lRet)
    {
      printf("exec error:%s\n",exec_msg);
      sqlite3_free(exec_msg);
      return ERR_CODE_DATA_BASE_EXEC_FAILED;
    }
    else
    {
        sqlite3_free(exec_msg);
        return ALL_OK;
    }
}

/******************************************
* 函数名:sqlite_interface_get_db_table
* 功能:获取数据表信息
* 描述:
* 入参描述
* 类型        名称         输入/输出      注
* char*     cmd_src          IN         
* char***   db_table_res     OUT
* int*      db_table_row     OUT
* int*      db_table_col     OUT
* 返回值:相关错误码
* 函数类型:外部可调用
*******************************************/ 
INT32 sqlite_interface_get_db_table( char *cmd_src,\
                                     char ***db_table_res,\
                                     int *db_table_row,\
                                     int *db_table_col)
{
    INT32 lRet = ALL_OK;
    char* db_err_msg = NULL; 

    if ( (NULL == cmd_src) || \
         (strlen(cmd_src) <= 0) || \
         (NULL == db_table_res) || \
         (NULL == db_table_row) || \
         (NULL == db_table_col) )
    {
        printf("Get Sqlite table Error,intput NULL!\n");
        return ERR_CODE_DATA_BASE_INPUT_NULL;
    }

    if(NULL == data_base_test)
    {
        printf("Data base not exist or already closed!\n");
        return ERR_CODE_DATA_BASE_EXEC_DB_ERR;
    }
    
    lRet = sqlite3_get_table(data_base_test,\
                             cmd_src,\
                             db_table_res,\
                             db_table_row,\
                             db_table_col,\
                             &db_err_msg );

    if (ALL_OK != iResult)
    {
        printf("Get table Err:%s\n", pErrMsg);
        sqlite3_free(db_err_msg);
        return ERR_CODE_DATA_BASE_GET_TABLE_FAILED;
    }
    else
    {
        sqlite3_free(pErrMsg);
        return ALL_OK;
    }
}

       C语言sqlite简单应用

#include <stdio.h>
#include <string.h>

#include "sqlite3.h"
#include "sqlite_interface.h"    /* 自定义sqlite接口头文件,对应c文件如上一代码片段 */

typedef int INT32;

#define DATA_BASE_FILE_NAME        "/sqlite_test"

/**************相关buffer大小定义******************/
#define PWD_PATH_BUFFER_SIZE        125
#define SQLITE_EXEC_STATE_SIZE      512

/*****************相关错误码定义********************/
#define ERR_CODE_INIT_FAILED        (ERR_CODE_BASES + 100)
#define ERR_CODE_INSERT_DATA_FAILED (ERR_CODE_BASES + 101)

/***************外部全局变量声明***************/
extern struct sqlite3 *data_base_test;

/******************************************
* 函数名:sqlite_init
* 功能:初始化数据库
* 描述:
* 入参描述
* 类型        名称         输入/输出      注
* 无
* 返回值:相关错误码
* 函数类型:外部可调用
*******************************************/ 
INT32 sqlite_init()
{
    char pwd_path[PWD_PATH_BUFFER_SIZE];
    char sqlite_exec_statement[SQLITE_EXEC_STATE_SIZE]=\
    "create table tablename(\n\
     id integer primary key,\n\
     name1 text not null,\n\
     age integer not null,\n\
     country text default 'china'\n\
     );";

    memset(pwd_path,0,PWD_PATH_BUFFER_SIZE);

    getcwd(pwd_path,PWD_PATH_BUFFER_SIZE);

    strcat(pwd_path,DATA_BASE_FILE_NAME);

    if(NULL != data_base_test)
    {
        if(QLL_OK != sqlite3_close(data_base_test) )
               return ERR_CODE_INIT_FAILED;
    }
    
    if(ALL_OK !=sqlite_interface_init_database(pwd_path) )
    {
        printf("Create data base failed!\n");
        return ERR_CODE_INIT_FAILED;
    }
    else
    {
        /* 创建新表单 */
        if(ALL_OK != sqlite_interface_exec_db_statement(sqlite_exec_statement))
        {
            printf("Create table Failed!\n");
        }
        return ALL_OK;
    }
}


/******************************************
* 函数名:sqlite_insert_data
* 功能:初始化数据库
* 描述:
* 入参描述
* 类型        名称         输入/输出      注
* 无
* 返回值:相关错误码
* 函数类型:外部可调用
*******************************************/ 
INT32 sqlite_insert_data()
{
    char exec_state_buf[]="insert into tablename values(1,'tom','china');";
    
    if(ALL_OK == sqlite_interface_exec_db_statement(exec_state_buf))
    {
        return ALL_OK;
    }
    else
    {
        printf("INser Error!\n");
        return ERR_CODE_INSERT_DATA_FAILED;
    }
    
}

......等功能函数,依据sqlite的数据库指令实现,具体指令如下:
插入数值:
insert into tablename values(1,'tom','china');

查询表单所有内容:
select * from tablename;

查询某一条记录:
select id,name1,age,country from tablename where name = 'tom' 
//查询名字为tom的所有信息,依据select后选中的键名返回数据

删除一条记录:
delete from tablename where name = 'tom'

删除所有记录:
delete from tablename

修改某一条记录中某一项数据
update tablename set age = 18 where name = 'tom' 

删除数据库文件的表单:
drop table tablename 

int main()
{
    sqlite_init();
    sqlite_insert_data();
    ......等等功能,依需实现
}

     2.1、C++写的独立sqlite类:

    以下类用于聊天工具记录客户端信息

头文件定义类:

#ifndef server_sqlite_H
#define server_sqlite_H

#include <QSqlDatabase>
#include <QSqlRecord>
#include <QSqlQuery>
#include <QSqlError>
#include <QDebug>

class server_sqlite //无继承的类(独立数据库操作类)
{

private:
    QSqlDatabase my_db;    //用户数据表单建立
    int count;             //用户在线人数
    QString temp;          //用于拼接字符用的临时变量
    QString output;        //用于输出用户信息
public:
    explicit server_sqlite()
    {
        count=0;
        temp.clear();
    }
    bool sqlite_init();    //初始化数据库用成员函数
    bool sqlite_insert(int id_s,QString name_t,QString  IP_t);   //插入数据
    bool sqlite_delete(QString name_m);                          //删除一条数据
    bool sqlite_delete_all();                                    //删除所有的数据
    QString* sqlite_search(QString name_s);                      //查找指定用户数据
    QString* sqlite_search_IP(QString name_s);                  //查找制定用户的IP地址
    bool sqlite_update(QString name_u,QString state_u);  //修改指定用户的在线与否信息
    QString* sqlite_online_server();    //输出在线用户信息,通过判断state是否是online
    QString* sqlite_offline_server();   //输出历史用户(不在线但是有其信息)
    bool sqlite_delete_table();         //删除表单(表单为临时配置文件,因此可以删除)
    int sqlite_search_id(QString name_src);
                             //依据名字查询ID号,ID号在转发数据时需要用
                                                       //于查找QList中的socket对象
     ~server_sqlite()        //析构
    {
        my_db.close();
    }
};
#endif

cpp文件具体实现:

#include "server_sqlite.h"
#include <QDebug>
#include <QString>

bool server_sqlite::sqlite_init()
{
    if(QSqlDatabase::contains("qt_sql_default_connection"))
        my_db=QSqlDatabase::database("qt_sql_default_connection");
    else
        my_db=QSqlDatabase::addDatabase("QSQLITE");//创建sqlite数据库文件
    if(!my_db.isValid())
    {
        qDebug()<<"数据库创建失败"<<endl;
        return false;
    }

    my_db.setDatabaseName("E:\\user_client.db");//将数据库文件存放在C盘,且名字为user_info.db
    if(!my_db.open())//判断数据库打开是否正常
    {
        qDebug()<<"数据库文件打开失败";
        return false;
    }
    else
    {
        qDebug()<<"数据库文件已打开";
    }
     QSqlQuery search;//数据库语句执行
    temp="create table user(id INT,name VARCHAR(15),IP VARCHAR(15),state VARCHAR(8))";//数据库表单:ID、用户名、IP地址、在线与否

    //qDebug()<<"创建表单:"<<temp;

    if(!search.exec(temp))//判断数据库语句执行是否正常
    {
        qDebug()<<"表单创建失败,原因:已存在数据库表单或文件读取错误,请检查!!";
    }
     sqlite_delete_all();
    return true;
}

bool server_sqlite::sqlite_insert(int id_s,QString name_t,QString  IP_t)//插入新的用户信息到数据库表单,格式:用户名、用户IP地址(字符串形式)
{
    temp.clear();
    temp.sprintf("insert into user values(%d,'%s','%s','在线')",id_s,name_t.toStdString().data(),IP_t.toStdString().data());

    QSqlQuery search;//数据库语句执行

    if(!search.exec(temp))
    {
         qDebug()<<"插入数值失败,请检查!!";
         return false;
    }
    count++;
    return true;
}

bool server_sqlite::sqlite_delete(QString name_m)//删除表单中某一个元素
{
    temp.clear();
    temp.sprintf("delete from user where name = '%s'",name_m.toStdString().data());
    QSqlQuery search;//数据库语句执行
    if(!search.exec(temp))
    {
         qDebug()<<"删除数值失败,请检查!!";
         return false;
    }
    return true;
}

bool server_sqlite::sqlite_delete_all()//删除表单中所有元素
{
    temp.clear();
    temp="delete from user";
    QSqlQuery search;//数据库语句执行
    if(!search.exec(temp))
    {
         qDebug()<<"删除所有数值失败,请检查!!";
         return false;
    }
    return true;
}

QString* server_sqlite::sqlite_search(QString name_s)//依据用户名查找对应的信息
{
    QString *des=new QString;
    temp.clear();
    temp.sprintf("select id,name,IP,state from user where name = '%s' ",name_s.toStdString().data());
    QSqlQuery search;//数据库语句执行
    if(!search.exec(temp))
    {
         qDebug()<<"查找指定数值失败,请检查!!";
         return NULL;
    }
    while(search.next())
    {
        *des+=search.value(1).toString()+"  "+search.value(2).toString()+"  "+search.value(3).toString()+"\n";
    }
    return des;
}

bool server_sqlite::sqlite_update(QString name_u,QString state_u)//修改用户在线信息
 {
     temp.clear();
     temp.sprintf("update user set state = '%s' where name = '%s'",state_u.toStdString().data(),name_u.toStdString().data());
     QSqlQuery search;//数据库语句执行
     if(!search.exec(temp))
     {
          qDebug()<<"修改指定用户状态失败,请检查!!";
          return false;
     }
     return true;
 }

QString* server_sqlite::sqlite_online_server()//显示当前在线用户信息
{
    QString *temp=new QString;
    QSqlQuery search;//数据库语句执行
    search.exec("select * from user");
    while(search.next())
    {
        if( "offline" != search.value(3))
        {
            //qDebug()<<"用户名:"<<search.value(1).toString()<<"IP地址:"<<search.value(2).toString()<<endl;
            *temp+=search.value(1).toString()+"  "+search.value(2).toString()+"\n";
        }
    }
    //qDebug()<<"原始信息拼接:"<<*temp;
    return temp;
}

QString* server_sqlite::sqlite_offline_server()//显示当前不在线用户信息
{
    QString *temp=new QString;
    QSqlQuery search;//数据库语句执行
    search.exec("select * from user");
    while(search.next())
    {
        if("online" != search.value(3))
            *temp+=search.value(1).toString()+"  "+search.value(2).toString()+"\n";
    }
   // qDebug()<<"不在线用户信息:"<<*temp;
    return temp;
}

 bool server_sqlite::sqlite_delete_table()//删除表单(表单为临时配置文件,因此可以删除)
 {
     temp.clear();
     temp.sprintf("drop table user");
     QSqlQuery search;//数据库语句执行
     if(!search.exec(temp))
     {
          qDebug()<<"删除表单失败,请检查!!";
          return false;
     }
     return true;
 }

 int server_sqlite::sqlite_search_id(QString name_src)
 {
     temp.clear();
     temp.sprintf("select id from user where name = '%s'",name_src.toStdString().data());
     QSqlQuery search;
     //qDebug()<<temp;
     if(!search.exec(temp))
     {
         qDebug()<<"表单查询失败,请检查!!";
         return -1;
     }
     if(search.first())
     {
        //qDebug()<<"所查ID为:"<<search.value(0).toInt();
         return search.value(0).toInt();
     }
     return -1;
 }

 QString* server_sqlite::sqlite_search_IP(QString name_s)//查找制定用户的IP地址
 {
     QString *t=new QString;
     temp.clear();
     temp.sprintf("select IP from user where name = '%s'",name_s.toStdString().data());
     QSqlQuery search;
     //qDebug()<<temp;
     if(!search.exec(temp))
     {
         qDebug()<<"表单查询失败,请检查!!";
         return NULL;
     }
     if(search.first())
     {
        //qDebug()<<"所查IP为:"<<search.value(0).toInt();
         *t=search.value(0).toString();
         return t;
     }
     return NULL;
 }

四、使用总结

       sqlite使用需要pthread库,数据库本身运行需要线程。

以上代码片段测试不是很全面,不足之处请多指正。

猜你喜欢

转载自blog.csdn.net/AMDDMA/article/details/81838834