Sqlite-3 小结

一、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数据库涉及的最基本的知识:

Sqlite-3 小结_第1张图片

二、sqlite3在qt中的使用

      2.1、C语言

#include 
#include 
/* 编译时要加'-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 
#include 

#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 
#include 
#include 
#include 
#include 

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 
#include 

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()<<"数据库创建失败"<

四、使用总结

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

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

你可能感兴趣的:(嵌入式学习)