Sqlite3数据库的初步学习

    技术2025-04-05  41

    Sqlite3数据库的初步学习

      最近由于项目的需要,初步学习Sqlite3数据库技术。现共享,希望能与家共同学习。至于深入的学习我将在后继的博客中与大家深入交流。SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中应用非常广泛(关注我博客的朋友,就会发现,我的另一篇博客:基于Ubuntu-WoojoyQT4mini电话薄设计,其实就一个成功的小案例)。同样,大家亦可以参考其官网:http://www.sqlite. org 

    需要说明的是,我使用的SQLite3中的API大约包括80个函数。只有8个函数在连接、查询和断开连接时必须的,其它的函数用来完成特定的任务。下我就从基础的函数使用讲起。

     

     

    一、创建表

             CREATE[TEMP|TEMPORARY]TABLE

       例如:       

    char *sql = "CREATE TABLE SensorData(/

    ID INTEGER PRIMARY KEY, /

    SensorID INTEGER, /

    SiteNum INTEGER, /

    Time VARCHAR(12), /

    SensorParameter REAL);";

      参数 [TEMP|TEMPORARY]是用来建立临时表用的。大家可以参考相关资料,如需要帮助,也可以在我博客中留言。

     

              SQLite具有以下五种数据类型:

     

            NULL:空值;INTEGER:带符号的整型,具体取决有存入数字的范围大小;REAL:浮点数字,存储为8-byte IEEE浮点数;TEXT:字符串文本;BLOB:二进制对象。

     

     

    二、改变表

             ALTER TABLE table{RENAME TO name|ADD COLUMN column_def}

         

    RENAME TO name对表重命名;

    ADD COLUMN column_def 增加表行信息;

    执行ALTER TABLE SensorData

    ADD COLUMN email TEXT NOT NULL DEFAULT "COLLATE NOCASE;完有:

    char *sql = "CREATE TABLE SensorData(/

    ID INTEGER PRIMARY KEY, /

    SensorID INTEGER, /

    SiteNum INTEGER, /

    Time VARCHAR(12), /

    SensorParameter REAL/

    email TEXT NOT NULL DEFAULT "COLLATE NOCASE;);";

     

    三、关系操作

     

     

     

     

     

     

    SELECT 语法        

     

    SELECT 语法说明 

         由于SELECT语句是比较复杂的语句,在此就不细说了。当然,我会在下面的实例中具体用到。

    四、打开数据库,关闭数据库

    Int  sqlite3_open(文件名,sqlite3 **);

    Int  sqlite3_close(sqlite3**);

    五、执行语句

    IInt sqlite3_exec(sqlite3*,cont char *sal,sqkite3_callback,void *,char **errmsg):

    这就是一条sql语句的函数。

    1个参数不再说了,是前面open函数得到的指针。

    2个参数const char *sql是一条sql 语句,以/0结尾。

    3个参数sqlite3_callback是回调函数,当这条语句执行之后,sqlite3会去调用你提供的这个函数(什么是回调函数,下面我会给出一个例子,助大家来理解)。

    4个参数void *是你所提供的指针,你可以传递任何一个指针到这里,这个参数最终会传到回调函数里面,如果不需要传递指针给回调函数,我们可以填NULL

    5个参数char ** errmsg是错误信息。注意是指针的指针。Sqlite3里面有很多回定的错误信息,执行sqlite3_exec之后,执行失败时可以查阅这个指针(直接printf("%s/n",errmsg))得到一串字符串信息,这串信息告诉你错在什么地方。

    注意:通常,sqlte3_callback和它后面的void* 这两个位置都可以真NULLNULL表示你不需要回调。比如你做insert操作,做delete操作,就没有必要使用回调。而当你做select时,就要使用回调,因为sqlite3把数据查出来,得通过回调告诉你查出了什么数据。

    II)回调函数

    Typedef  int(*sqlite3_callback)(voic *,int ,char ** ,char **);

    下面是回调函数一个实例,现与大家共享:

    #include <stdio.h>

    #include <stdlib.h>

    #include "sqlite3.h"

    int callback(void *data,int ncols,char **values,char **headers)

    {

    int i;

    fprintf(stderr,"%s:",(const char *)data);

    for(i=0;i<ncols;i++)

    {

    fprintf(stderr,"%s=%s",headers[i],values[i]);

    fprintf(stderr,"/n");

    }

    return 0;

    }

    int main(int argc,char **argv)

    {

    sqlite3 *db;

    int rc;

    char *sql;

    char *zErr;

    char *data;

    rc=sqlite3_open("test.db",&db);

    if(rc)

    {

    fprintf(stderr,"Can't open database:%s/n",sqlite3_errmsg(db));

    sqlite3_close(db);

    exit(1);

    }

    sql="CREATE TABLE ta(/

    ID INTEGER PRIMARY KEY,/

    name VARCHAR(32));";

    rc=sqlite3_exec(db,sql,NULL,NULL,&zErr);

    if(rc!=SQLITE_OK)

    {

    if(zErr!=NULL)

    {

    //fprintf(stderr,"SQL error:%s/n",zErr);

     sqlite3_free(zErr);

     }

    }

    data="Callback function called/n";

    sql="insert into /"ta/" values(NULL,'888');";

    sqlite3_exec(db,sql,NULL,NULL,&zErr);

     

    sql="select *From ta;";

    rc=sqlite3_exec(db,sql,callback,data,&zErr);

    if(rc!=SQLITE_OK)

    {

    if(zErr!=NULL)

    {

    fprintf(stderr,"SQL error:%s/n",zErr);

    sqlite3_free(zErr);

    }

    }

    sqlite3_close(db);

    return 0;

    }

    以下是Ubuntu-Woojoy下运行的结果:

     

    虽然回调显得代码整齐,但有时,你还是可想要非回调的select 查询。这可以通过下面的函数做到。

    IIIint sqlite3_get_table(sqlite3* ,const char *sql,char ** resultp,int *nrow,,int *ncolumn,char **errmsg);

    1个参数,同上。

    2个参数是sql语句,跟sqlite3_exec里的sql是一样的。

    3个参数是查询结果,它依然一维数组(不要以为是二维数组,更不要以为是三维数组)。

    4个参数是查询出多少条记录(即查出多少行)。

    5个参数是多个字段(多少列)。

    6个参数是错误信息,跟前面一样。

    六、修改数据

    Sqlite3主要有2DML语句用于修改数据------INSERT ,UPDATE,DELETE

    INSERT INTO table(column_list)VALUES(value_list);

    UPDATE table SET update_list WHERE predicate;

    DELETE FROM foods WHERE name='';

    七、下面我们就上面的知识来一个实用例子(在Ubuntu-Woojoy运行通过)

    #include <stdio.h>

    #include <stdlib.h>

    #include "sqlite3.h"

    //#define _DEBUG_

     

    int main()

    {

    sqlite3 *db = NULL;                        

    char    *zErrMsg = 0;

    int rc;

     

    rc = sqlite3_open("zieckey.db", &db);

    if (rc)

    {

    fprintf(stderr, "can't open database: %s/n", sqlite3_errmsg(db));

    sqlite3_close(db);

    exit(1);

    }

    else

    printf("open database/n");

     

    char *sql = "CREATE TABLE SensorData(/

    ID INTEGER PRIMARY KEY, /

    SensorID INTEGER, /

    SiteNum INTEGER, /

    Time VARCHAR(12), /

    SensorParameter REAL);";

     

    // printf("OK, %d/n", __LINE__);

    sqlite3_exec(db, sql, NULL, NULL, &zErrMsg);

    // printf("OK, %d/n", __LINE__);

     

    #ifdef _DEBUG_

    printf("%s/n", zErrMsg);

    #endif

     

    // printf("OK, %d/n", __LINE__);

     

    /*<----------------------------insert------------------------------------------->*/

     

    sql = "INSERT INTO /"SensorData/" VALUES(NULL, 1, 1, '200605011206', 18.9);";

    rc = sqlite3_exec(db, sql, 0, 0, &zErrMsg);//执行不需要返回数据的查询

    if (rc != SQLITE_OK)

    {

    printf("failed exec!, err_code: %d, err_reason: %s/n", rc, zErrMsg);

    }

     

    // printf("OK, %d/n", __LINE__);

     

    sql = "INSERT INTO /"SensorData/" VALUES(NULL, 1, 1, '200605011306', 16.9);";

    sqlite3_exec(db, sql, 0, 0, &zErrMsg);

    /*if(rc!=QLITE_OK){

    if(zERR!=NULL){

    fprintf(stderr,"SQL error:%s/n",zErr);

    sqlite_free(zErr);

    }

    }*/

     

    // printf("OK, %d/n", __LINE__);

     

    /*<-----------------------------query--------------------------------------->*/

    int  nrow = 0;

    int  ncolumn = 0;

    char **azResult;

     

    sql = "SELECT * FROM SensorData;";

    //返回一个表格化的结果集

    sqlite3_get_table(db, sql, &azResult, &nrow, &ncolumn, &zErrMsg);

     

    int i = 0;

    printf("row: %d, column: %d/n", nrow, ncolumn);

    printf("the queried result is:/n");

     

    for (i=0; i<(nrow+1)*ncolumn; i++)

    printf("azResult[%d]: %s/n", i, azResult[i]);

     

    /*<-----------------------------delete--------------------------------------->*/

     

     

    sql = "DELETE FROM SensorData WHERE ID = 1 ;" ; 

    sqlite3_exec( db , sql , 0 , 0 , &zErrMsg ); 

     

    #ifdef _DEBUG_ 

    printf("zErrMsg = %s /n", zErrMsg); 

    #endif

     

    sql = "SELECT * FROM SensorData;"; 

    sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg ); 

    printf( "/n/n/n/nrow:%d column=%d " , nrow , ncolumn ); 

    printf( "/nAfter deleting , the result of querying is : /n" ); 

    for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ ) 

    printf( "azResult[%d] = %s/n", i , azResult[i] ); 

     

    sqlite3_free_table(azResult);

     

    #ifdef _DEBUG_

    printf("%s/n", zErrMsg);

    #endif

     

     

     

    /*<-----------------------------update--------------------------------------->*/

     

    sql = "UPDATE SensorData SET ID ='1' WHERE ID ='2';" ;

            puts(sql);

    sqlite3_exec( db , sql , 0 , 0 , &zErrMsg ); 

     

    #ifdef _DEBUG_ 

    printf("/nzErrMsg = %s /n", zErrMsg); 

    #endif

     

    sql = "SELECT * FROM SensorData;"; 

    sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg ); 

    printf( "/n/n/n/nrow:%d column=%d " , nrow , ncolumn ); 

    printf( "/nAfter update , the result of querying is : /n" ); 

    for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ ) 

    printf( "azResult[%d] = %s/n", i , azResult[i] ); 

     

    sqlite3_free_table(azResult);

     

    #ifdef _DEBUG_

    printf("%s/n", zErrMsg);

    #endif

    sqlite3_close(db);

    return 0;

    }

     

     

    八、下面与大家共享一个自创函数(在Ubuntu-Woojoy运行通过)

        关于自创函数的概念。大可以查阅相关资料。时于时间的关系,我就不详述了,如需要帮助,可以在我博客上留言。

    #include <stdio.h>

    #include <stdlib.h>

    #include "sqlite3.h"

    #include <string.h>

    void function(sqlite3_context *ctx,int nargs,sqlite3_value **values)

    {

    int i;

    const char *msg;

    fprintf(stdout,"function():Called with %i arguments/n",nargs);

    for(i=0;i<nargs;i++)

    {

    fprintf(stdout,"   arg%i:value=%-7s type=%i/n",i,

    sqlite3_value_text(values[i]),

    sqlite3_value_type(values[i]));

    }

    if(strcmp((const char *)sqlite3_value_text(values[0]),"fail")==0)

    {

    msg="function():Failing because you told me to.";

    sqlite3_result_error(ctx,msg,strlen(msg));

    fprintf(stdout,"/n");

    return;

    }

    fprintf(stdout,"/n");

    sqlite3_result_int(ctx,0);

    }

    int execute(sqlite3* db,const char *sql,...)

    {

    char *err,*tmp;

    va_list ap;

    va_start(ap,sql);

            //sql = sqlite3_mprintf("INSERT INTO /"TelephoneData/" VALUES(NULL, '%s', '%s','%s','%s','%s','%s');", c_str1,c_str2,c_str3,c_str4,c_str5,c_str6);

     

    tmp=sqlite3_vmprintf(sql,ap);

    va_end(ap);

    int rc=sqlite3_exec(db,tmp,NULL,NULL,&err);

     

    if(rc!=SQLITE_OK)

    {

    if(err!=NULL)

    {

    fprintf(stdout,"execute():Error%i:%s/n",rc,err);

    sqlite3_free(err);

    }

    }

    sqlite3_free(tmp);

    return rc;

    }

    int main(int argc,char **argv)

    {

    int rc;

    sqlite3 *db;

    const char *sql;

     

    sqlite3_open("test.db",&db);

    sqlite3_create_function(db,"function",-1,SQLITE_UTF8,NULL,function,NULL,NULL);

    //db connection data,-1 is maybe have servel various 

    //0 is no have a various

    /*Turn on SQL logging*/

    //log_sql(db,1);

    /*Call function with one text argument.*/

    execute(db,"select function(1)");

    /*Call function with several arguments of various types.*/

    execute(db,"select function(1,2.71828)");

    /*Call function with variable argument's value 

     * *being 'fail'.This will trigger the function to call

     * *sqlite3_result_error().*/

    execute(db,"select function('fail',2.717828,'three',X'0004',NULL)");

    /*Done*/

    sqlite3_close(db);

     

    return 0;

    }

     

    九、结束语

         首先非常感激您能阅完本文章。本篇由本人个人创作,当然欢迎您进行批评指正。

    你也可以进行转载,但需标明出处,谢谢合作!!

     

    最新回复(0)