浅谈嵌入式数据库sqlite
浅谈嵌入式数据库sqlite相信很多从事IT行业的同仁应该都用过数据库,数据库的选择也非常多,如霸主Oracle,Mysql,PostgreSQL,sqlite3等等。各种数据库各有优缺点,这里不做详细描述。这里我们来学习一下sqlite3,sqlite是一种轻量级数据库,本身就是一个文件,没有第三方库的依赖,也不需要专门的数据库后台服务支撑,广泛用于嵌入式领域,安卓系统等。麻雀虽小五脏俱全,s.
浅谈嵌入式数据库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
更多推荐
所有评论(0)