SQLite移植和使用

    技术2022-05-20  42

    一、环境介绍

    1、主机环境:ubuntu10.04

    2、交叉编译器:arm-none-linux-gnueabi-gcc-4.3.2

    3、软件包:sqlite-3.6.1.tar.bz2

    4、sqlite-3.6.1.tar.bz2解压到主机的/opt/studyarm/SQLite-transplant目录下,并重命名为sqlite,在同一级目录下在新建目录sqlite-arm,这个目录来放编译后产生的文件。

    二、移植步骤

    1、配置SQLite

    sqlite目录下进行如下配置:

    ./configure --prefix=/QT/sqlite3 --disable-tcl --host=arm-none-linux-gnueabi

    2、编译

    make

    3、安装

    make install

    该命令将编译好的文件安装到sqlite-arm目录下,在sqlite-arm目录下会生成binlibinclude目录,bin目录下是sqlite3可执行文件,lib目录下包含运行sqlite3所依赖的库,另外在编译,另外在编译sqlite应用程序时,必须指明所依赖的头文件和库。

    4、去掉调试信息(可选)

    文件编译后会产生许多调试信息,下载到开发板将会占用较多存储器。我在编译后lib目录下文件大小达到2.2M,占用了不少Flash,为减小Flash占用去掉不必要的调试信息。在sqlite_arm目录下执行如下命令:

    arm-linux-strip bin/*

    arm-linux-strip lib/*

    去掉调试信息后文件大小减小许多。将sqlite_arm /bin目录下的文件sqlite3拷贝到根文件系统的bin目录下,并将sqlite_arm/lib目录下的文件拷贝到根文件系统的lib目录下。

    三、测试

    1、新建数据库

    [rootMrFeng]#sqlite3 test.db

    SQLite version 3.6.18

    Enter ".help" for instructions

    Enter SQL statements terminated with a ";"

    sqlite> create table film (number,name);

    sqlite> insert into film values (1,'aaa');

    sqlite> insert into film values (2,'bbb');

    sqlite> select * from film;

    1|aaa

    2|bbb

    sqlite>.quit

    [rootMrFeng]#

    蓝色部分为输入。

    2、测试程序

    这里以SQLite官方站点http://sqlite.orgquick start文档中的测试程序为例对移植到ARM-Linux上的SQLite3进行测试。该程序清单如下:

    //test_sqlite.c

    #include <stdio.h>

    #include <sqlite3.h>

     

    static int callback(void *NotUsed, int argc, char **argv, char **azColName)

    {

        int i;

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

        {

            printf("%s = %s/n", azColName[i], argv[i] ? argv[i] : "NULL");

        }

        printf("/n");

        return 0;

    }

     

    int main(int argc, char **argv)

    {

        sqlite3 *db;

        char *zErrMsg = 0;

        int rc;

        if( argc!=3 )

        {

            fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT/n", argv[0]);

        }

        rc = sqlite3_open(argv[1], &db);

        if( rc )

        {

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

            sqlite3_close(db);

        }

        rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);

        if( rc!=SQLITE_OK )

        {

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

        }

        sqlite3_close(db);

        return 0;

    }

    使用如下命令编译测试程序:

    arm-linux-gcc -o test_sqlite test_sqlite.c -lsqlite3 -L/opt/studyarm/SQLite-transplant/sqlite_arm/lib -I/opt/studyarm/SQLite-transplant/sqlite_arm/include

    使用如下命令去掉调试信息:

    arm-linux-strip test_sqlite

    3、在上面新建的数据库目录下测试:

    [rootMrFeng]#./test_sqlite  test.db  "select * from film"

    number = 1

    name = aaa

     

    number = 2

    name = bbb

     

    [rootMrFeng]#

     

    四、使用

      下面是常用的指令:

         sqlite3 *db=NULL;

         char *zErrMsg = 0;//提示信息

         int rc;

        

         //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件

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

         //关闭

         sqlite3_close(db);

         //创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中

         char *sql = " CREATE TABLE SensorData(  ID INTEGER PRIMARY KEY,  SensorID INTEGER,  SiteNum INTEGER,  Time VARCHAR(12),  SensorParameter REAL);" ;

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

        //插入数据

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

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

         sql = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '200605011306', 16.4 );" ;

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

        //查询数据

         /*

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

         result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。

         nrow ,ncolumn分别为查询语句返回的结果集的行数,列数,没有查到结果时返回0

         */

         int nrow = 0, 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( "\nThe result of querying is : \n" );

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

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

        //删除数据

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

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

         //释放掉 azResult 的内存空间

         sqlite3_free_table( azResult );

     

     

     

     

     

     


    最新回复(0)