Sqlite3入门学习(一)

岁酱吖の 提交于 2020-02-15 02:47:47

Linux环境下sqlite3的安装及常用Linux API说明

  1. 环境安装

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,检测是否安装成功,如下图所示表示安装成功

  1. 常用Linux API说明
    1. sqlite3_open

int sqlite3_open(const char* fileName, sqlite3** ppDB);

函数功能:打开一个数据库;若该数据库文件不存在,则自动创建。打开或者创建数据库的命令会被缓存,直到这个数据库真正被调用的时候才会被执行。

输入参数:fileName,待打开的数据库文件名称,包括路径,以'\0'结尾;

特别说明:SQLite 支持内存数据库,内存方式存储使用文件名":memory:"

输出参数:ppDB,返回打开的数据库句柄;

返回值:执行成功返回SQLITE_OK,否则返回其他值;

 

    1. sqlite3_close

int sqlite3_close(sqlite3* pDB);

函数功能:关闭一个打开的数据库;

输入参数:pDB,打开的数据库句柄

输出参数: 无

返回值:执行成功返回SQLITE_OK,否则返回其他值

    1. 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,否则返回其他值

    1. 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会不断调用回调函数,直到其他进程或者线程释放锁。获得锁之后,不会再调用回调函数,从而向下执行,进行数据库其他操作

    1. 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;
}

运行结果部分下图所示

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!