Linux环境下sqlite3的安装及常用Linux API说明
- 环境安装
Step1:一般的linux可能会自带sqlite,在安装之前先使用sqlite3命令检测一下,若显示并未安装,则进行下述操作
Step2:先到 https://www.sqlite.org/download.html ,下载sqlite-autoconf-*.tar.gz压缩包
Step3:下载完了,把压缩包放进Linux系统中,放在Ubuntu的桌面,然后解压
Step4:进入解压后路径接着执行命令./configure --prefix=/usr/local 表示安装至usr/local路径下;
Step5: 接着执行命令 make
Step6: 最后执行命令make install
Step7:执行命令sqlite3,检测是否安装成功,如下图所示表示安装成功
- 常用Linux API说明
- sqlite3_open
int sqlite3_open(const char* fileName, sqlite3** ppDB);
函数功能:打开一个数据库;若该数据库文件不存在,则自动创建。打开或者创建数据库的命令会被缓存,直到这个数据库真正被调用的时候才会被执行。
输入参数:fileName,待打开的数据库文件名称,包括路径,以'\0'结尾;
特别说明:SQLite 支持内存数据库,内存方式存储使用文件名":memory:"
输出参数:ppDB,返回打开的数据库句柄;
返回值:执行成功返回SQLITE_OK,否则返回其他值;
-
- sqlite3_close
int sqlite3_close(sqlite3* pDB);
函数功能:关闭一个打开的数据库;
输入参数:pDB,打开的数据库句柄
输出参数: 无
返回值:执行成功返回SQLITE_OK,否则返回其他值
-
- sqlite3_exec
函数功能:编译和执行零个或多个SQL 语句,查询的结果返回给回调函数callback
int sqlite3_exec(sqlite3* pDB, const char *sql, sqlite_callback callback, void*para, char** errMsg);
输入参数:
pDB:数据库句柄;
sql:待执行的SQL 语句字符串,以'\0'结尾;
callback:回调函数,用来处理查询结果,可以输入NULL;
para:传入的参数,可以为NULL,该参数被传给回调函数callback调用;
输出参数:errMsg,返回错误信息,注意是指针的指针。
返回值:执行成功返回SQLITE_OK,否则返回其他值
-
- sqlite3_busy_handle()
int sqlite3_busy_handle(sqlite3*, int(*)(void *, int), void *);
第一个参数:当你调用sqlite_busy_handle函数时传递给它的一个void*的参数的拷贝;
第二个参数是因此这次锁事件,该回调函数被调用的次数。
如果回调函数返回0时,将不再尝试再次访问数据库而返回SQLITE_BUSY或者SQLITE_IOERR_BLOCKED。
如果回调函数返回非0, 将会不断尝试操作数据库。
详细说明:程序运行过程中,如果有其他进程或者线程在读写数据库,那么sqlite3_busy_handler会不断调用回调函数,直到其他进程或者线程释放锁。获得锁之后,不会再调用回调函数,从而向下执行,进行数据库其他操作
-
- sqlite3_get_table()
此函数接受sql中的SQL语句返回的所有记录,使用堆上声明的内存(使用sqlite3_malloc())将所有记录存储在参数char*** pazResult中。必须使用sqlite3_table_free()函数释放内存
该函数将char ***pazResult指针作为唯一的参数。pazResult中的第一个记录其实并不是记录,而且结果集中列的名称。
int sqlite3_get_table(
sqlite3 *db, //打开的数据库的句柄
const char *zSql, //要执行的SQL语句
char ***pazResult, //结果写入该指针指向的char***
int *pnRow, //结果集中行的数目
int *pnColumn, //结果集中列的数目
char **pzErrmsg //错误信息
);
第2个参数是sql 语句,跟sqlite3_exec 里的sql 是一样的。是一个很普通的以\0结尾的char*字符串。
第3个参数是查询结果,它依然一维数组,它内存布局是:字段名称,后面是紧接着是每个字段的值。第4个参数是查询出多少条记录(即查出多少行,不包括字段名那行)。
第5个参数是多少个字段(多少列)。
第6个参数是错误信息。
pazResult返回的字符串数量实际上是(*pnRow+1)*(*pnColumn),因为前(*pnColumn)个是字段名
编程示例
#include <stdio.h>
#include <sqlite3.h>
#include <string.h>
int callback(void*,int,char**,char**);
int main()
{
sqlite3* db;
char* errmsg;
char *strSql = (char*)malloc(sizeof(char)*2048*1024);
char *showResult;
char** pResult;
int nRow;
int nCol ,i ,j,index=1;
int nResult = sqlite3_open("MyTest.db",&db);
if(nResult)
printf("can not open database.\n");
else
printf("open database succsee.\n");
nResult = sqlite3_exec(db,"create table fuck_U(id integer,name varchar(100))",NULL,NULL,&errmsg);
if (nResult != SQLITE_OK)
{
printf("errmsg = %s\n",errmsg);
/* sqlite3_close(db);
sqlite3_free(errmsg);*/
}
int kk = 0;
kk = sprintf(strSql,"insert into fuck_U values(%d,'zhangsan');\n",index);
for(index = 2;index < 100;index++)
{
kk += sprintf(strSql+kk,"insert into fuck_U values(%d,'zhangsan');\n",index);
}
printf("%s",strSql);
nResult = sqlite3_exec(db,strSql,NULL,NULL,&errmsg);
if (nResult != SQLITE_OK)
{
//sqlite3_close(db);
printf("errmsg= %s\n",errmsg);
//sqlite3_free(errmsg);
//return 0;
}
strSql = "select * from fuck_U";
nResult = sqlite3_get_table(db,strSql,&pResult,&nRow,&nCol,&errmsg);
if (nResult != SQLITE_OK)
{
sqlite3_close(db);
printf("errmsg= %s\n",errmsg);
sqlite3_free(errmsg);
return 0;
}
printf("nRow= %d\n",nRow);
printf("nCol= %d\n",nCol);
char strOut[1024];
int nIndex = nCol;
int pos = 0;
printf("hello sqlite db\n");
for(i=0;i<nRow;i++)
{
for(j=0;j<nCol;j++)
{
pos = sprintf(strOut,"%s:",pResult[j]);
pos += sprintf(strOut+pos,"%s",pResult[nIndex]);
printf("%s\n",strOut);
++nIndex;
}
}
sqlite3_free_table(pResult);
sqlite3_close(db);
return 0;
}
运行结果部分下图所示
来源:CSDN
作者:AlphaGQ
链接:https://blog.csdn.net/AlphaGQ/article/details/104320138