浅谈嵌入式数据库sqlite

相信很多从事IT行业的同仁应该都用过数据库,数据库的选择也非常多,如霸主Oracle,Mysql,PostgreSQL,sqlite3等等。各种数据库各有优缺点,这里不做详细描述。这里我们来学习一下sqlite3,sqlite是一种轻量级数据库,本身就是一个文件,没有第三方库的依赖,也不需要专门的数据库后台服务支撑,广泛用于嵌入式领域,安卓系统等。麻雀虽小五脏俱全,sqlite的特点还是非常的多,这里我们列举几个:
1.速度快
2.体积小
3.只有13万行代码左右(4.43M)
4.完全开源。
5.完全没有依赖。
6.支持事务处理等等~
有这么多的优点,简直是利器,大家就可以愉快的玩耍了。SQLite第一个Alpha版本诞生于2000年5月。 至2015年已经有15个年头新版本SQLite 3发 布。如果需要在工程中使用sqlite,需要先下载sqlite源码:https://www.sqlite.org/download.html
下载完成后如果是嵌入式设备就需要交叉编译成相应平台的.so库。当然理论上直接把源代码放到工程中调用也可以,但是应该没人会这样干。接下来开始我们代码冲浪之旅。

#ifndef SQLITE_H
#define SQLITE_H
#include <sqlite3.h>
#include <string.h>

using namespace std;

class SQLite
{
public:
    SQLite();
    ~SQLite();
    
    int SQLInit(void) ;
    int SQLClose(void);
    int createTable(void) ;

    int bufferBegin(void);//事务操作开始
    int bufferCommit(void);//事务操作结束

    int insertData(string id, string ip);
    int deleteData(string id);
    int selectData(string id);
private:
    sqlite3 *mDB;
    
}// SQLITE_H

static void callback(void *user, int argc, char **argv, char **azColName)
{
    printf("select id:%s,ip:%s",argv[0],argv[1]);
}

SQLite::SQLite()
{
    mDB = NULL;
	SQLInit();
}

int SQLite::SQLInit()
{
    int rc = 0;
    char tempPath[256] = {0};
    strcpy(tempPath,"./IP_DB.db");
    rc = sqlite3_open(tempPath, &mDB);
    if(rc)
    {
        printf("can't open database: %s", sqlite3_errmsg(mDB));
        return -1;
    }
	else
    {
        printf("opened database successfull!");
    }
    rc = CreateIDCardTable();
    
    return rc;
}

int SQLite::SQLClose()
{
    sqlite3_close(mDB);
    return 0;
}

int SQLite::createIDCardTable(void)
{
    if(mDB== NULL)
    {
        return -1;
    }
    char *zErrMsg = 0;
    int	rc;
    char sql[200] = "CREATE TABLE IF NOT EXISTS IPTable (id TEXT PRIMARY KEY, ip TEXT);";    
    /* Execute SQL*/
    rc = sqlite3_exec(mdb, sql, callback, 0, &zErrMsg);
    if( rc != SQLITE_OK )
    {
        printf("SQL error: %s,statement=%s", zErrMsg,sql);
        sqlite3_free(zErrMsg);
    }
    else
    {
        printf("Table tbIDCard created successfull!");
    }
	return rc;
}
int SQLite::bufferBegin()
{
    if(mDB== NULL)
    {
        return ;
    }
    char *zErrMsg = 0;
    int rc = sqlite3_exec(mDB, "BEGIN;", 0, 0, &zErrMsg);
    if( rc != SQLITE_OK )
    {
        printf("SQL error: %s,statement=BEGIN", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    return rc;
}
int SQLite::bufferCommit()
{
    if(mDB== NULL)
    {
        return ;
    }
    char *zErrMsg = 0;
    int rc = sqlite3_exec(mDB, "COMMIT;", 0, 0, &zErrMsg);
    if( rc != SQLITE_OK )
    {
        printf("SQL error: %s,statement=COMMIT;", zErrMsg);
        sqlite3_free(zErrMsg);
    }
    return rc;
}
int SQLite::insertData(string id, string ip)
{
    if(mdb == NULL)
    {
        return -1;
    }
    string sqlstate = "INSERT INTO IPTable ";
    sqlstate += "(id,ip) VALUES('" + id+ "','" + ip  + "');";
    /* Execute SQL*/
    int  rc = 0;
    char *zErrMsg = 0;
    rc = sqlite3_exec(mdb, sqlstate.c_str(), NULL, 0, &zErrMsg);
    if( rc != SQLITE_OK )
    {
        printf( "SQL error: %s,statement=%s", zErrMsg,sqlstate.c_str());
        sqlite3_free(zErrMsg);
    }
    return rc;
}

int SQLite::deleteData(string id)
{
    string sqlselect = "DELETE FROM IPTable  ";
    if(id.empty())
    {
        printf("delete all data from sqlite!");
    }  
    else
    {
        sqlselect += "where id= '";
        sqlselect += id;
        sqlselect += "'";
    }
    /* Execute SQL */
    int  rc = 0;
    char *zErrMsg = 0;
    rc = sqlite3_exec(mDB, sqlselect.c_str(), NULL, 0, &zErrMsg);
    if( rc != SQLITE_OK )
    {
        printf( "SQL error: %s,statement=%s", zErrMsg,sqlselect.c_str());
        sqlite3_free(zErrMsg);
    }
    return rc;
}

int SQLite::selectData(string id)
{
    string sqlselect = "select * FROM IPTable ";
    if(id.empty())
    {
    	printf("select all data from sqlite!");
    }  
    else
    {
        sqlselect += "where id= '";
        sqlselect += id;
        sqlselect += "'";
    }
    /* Execute SQL*/
    int  rc = 0;
    char* zErrMsg = 0;
    rc = sqlite3_exec(mDB, sqlselect.c_str(), callback, (void*)this, &zErrMsg);
    if( rc != SQLITE_OK )
    {
        printf( "SQL error: %s,statement=%s", *zErrMsg,sqlselect.c_str());
        sqlite3_free(zErrMsg);
    }
    return rc;
}

ok。喝杯水休息一会。到此一个完整的sqlite的使用过程的接口就写完了,可以愉快的储存自己需要掉电保存的数据了。希望这个能帮到大家。当然作为Qt爱好者,Qt内置了sqlite,Qt已经封装好了接口,使用很方便。喜欢的可以点赞哈~

作者:费码程序猿
欢迎技术交流:QQ:2558950565

Logo

更多推荐