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数据库涉及的最基本的知识:
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库,数据库本身运行需要线程。
以上代码片段测试不是很全面,不足之处请多指正。