sqlite使用说明及在POWERPC平台上的移植

1简介

SQLite是一个开源的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,可以工作在许多嵌入式操作系统下,比如QNX,VxWorks,Palm OS, Symbin和Windows CE,同时,SQLite是一个轻量级的嵌入式数据库,很适合用于嵌入式设备。

SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程,但在进程内部,它却是完整的自包含的数据库引擎。

准备工作

在使用C++操作SQLite之前,需要获得sqlite3.h,sqlite3.lib,sqlite3.dll,大家可以在这里下载。并将这3个文件导入VC++工程中。其中sqlite3.dll文件放到Debug文件夹里。

SQLite API介绍

int sqlite3_open(char *path,sqlite3 **db)
这个函数打开数据库,第一个参数为sqlite文件的地址,第二个参数是sqlite3的指针的指针,也就是二级指针。
返回值为SQLITE_OK则成功打开数据库。

sqlite3_close(sqlite3 *db)
这个函数关闭数据库,参数是sqlite3的指针。

sqlite3_exec(sqlite3 *db,char *sql,int l,int m,int n)
这个函数执行SQL语句,如果我们不需要返回的结果就用这个函数执行SQL语句。第一个参数是sqlite3的指针,第二个参数为执行的SQL语句,后面3个参数我们不用关心,都设为0。

sqlite3_get_table(sqlite *db,char *sql,char ***result,int *row,int *column,int k);
这个函数执行查询语句,返回我们所需要的信息。第一个参数是sqlite的指针,第二个参数是SQL语句,第三个参数是返回的信息。row是返回的行数,column是返回的列数,最后一个参数设为0就行了。


2编译安装

官网下载地址:http://www.sqlite.org/sqlite-amalgamation-3.6.22.tar.gz

基于实际项目需求,以下主要讲述交叉编译的步骤:

2.1

$ tar zxf sqlite-amalgamation-3.6.22.tar.gz

$ cd sqlite-3.6.22

$ CC=ppc_8xx-gcc LD=ppc_8xx-ld ./configure --host=ppc-linux

$ make

然后将生成的动态库拷贝到根文件系统/usr/lib中.

2.2

由于在主机上已经有x86版本的libsqlite3.so,我们交叉编译生成的libsqlite3.so不能在主机上make install,否则会覆盖掉x86版本的libsqlite3.so.我们编译应用程序时要把交叉编译出的libsqlite3.so拷到应用程序工程目录中,最好是和应用程序的Makefile同一级目录中,同时要把sqlite3.h头文件拷到同一级目录中,并在Makefile中用-L. –I.分别指定库和头文件路径,最后将交叉编译生成的应用程序和在主机上建好的XX.db数据库文件拷贝到目标板上同一级目录中,将交叉编译出的libsqlite3.so拷到目标板的/usr/lib目录中,同时在/usr/lib中建立一个指向libsqlite3.so的软链接libsqlite3.so.0, 否则会报错。另外如果需要在目标板上使用sqlite3的命令行命令,则还需要将交叉编译出的可执行文件sqlite3拷贝到目标板上/usr/bin中.

3常用命令

$ sqlite3 test.db //创建/打开数据库文件

sqlite>

sqlite> create table table_name(id integer primary key, name text, gender text, age integer); //创建表格示例

sqlite> .tables //显示test.db中存在的表格

sqlite> .schema table_name //显示表名及各字段的名称/数据类型

sqlite> .drop table table_name //删除表

sqlite> .import data.txt table_name //从数据文件data.txt中导入数据到表格中, data.txt中每一列用|分隔, |两边不要空格,文件末尾不要有空行:

例如 1|richardstallman|male|24         

sqlite> .exit //退出

4SQL语句示例

//插入一条记录到表里

insert into table_name values (5, 'li', 'female', 23);

// 查询id字段大于2的记录,并根据年龄字段按降序排列

select * from table_name where id>2 order by age desc;

// 查询id字段大于2的记录,并只显示id,name,gender三个字段

select id>2, name, gender from table_name;

// 显示表中的所有记录

select * from table_name;

// 从第三行开始,查询10条记录:

select * from table_name limit 3,10;

// 删除id字段等于5或name字段为’tom’的记录

delete from table_name where id=5 or name='tom';

// 更新表中name字段为‘zh’的记录的age和name字段的值

update table_name set age=25, name='zhang' where name='zh';

//部分匹配地模糊查询,模糊查询效率很低,尽量不要使用

select * from table_name where id like '%216%';

5 API

int sqlite3_open(const char *filepath, sqlite3 **db);

int sqlite3_exec(

sqlite3 *db,         /* An open database */

const char *sql,     /* SQL to be executed */

sqlite_callback,     /* Callback function */

void *,              /* 1st argument to callback function */

char **errmsg        /* Error msg written here */

};

int sqlite3_get_table(

sqlite3 *db,         /* An open database */

const char *sql,     /* SQL command string */

char ***dbresult,    /* the address of a char **buffer which to hold enquiry result */

int *nRow,           /* Row of segment */

int *nColumn,        /* Column of segment */

char **errmsg);      /* error message buffer */

int sqlite3_close(sqlite3 *db);

6

sqlite 是支持事务处理的。如果你知道你要同步删除很多数据,不仿把它们做成一个统一的事务。通常一次 sqlite3_exec 就是一次事务,如果你要删除1万条数据,sqlite就做了1万次:开始新事务->删除一条数据->提交事务->开始新事务->… 的过程。这个操作是很慢的。因为时间都花在了开始事务、提交事务上。你可以把这些同类操作做成一个事务,这样如果操作错误,还能够回滚事务。事务的操作没有特别的接口函数,它就是一个普通的 sql 语句而已。

分别如下:

int result;

result = sqlite3_exec( db, "begin transaction", 0, 0, &zErrorMsg ); //开始一个事务

result = sqlite3_exec( db, "commit transaction", 0, 0, &zErrorMsg ); //提交事务

result = sqlite3_exec( db, "rollback transaction", 0, 0, &zErrorMsg ); //回滚事务

7API

int db_init(const char *db_filepath, db_handler **db);

int db_sql(db_handler *db, const char *sql, char ***dbresult, int *nRow, int *nColumn, char **errmsg);

int db_term(db_handler *db, char **dbresult);

8程序

/* test_db.c */

#include "db.h"

int main( int argc, char **argv)

{

    db_handler *db;

    int result;

    char *errmsg = NULL;

    char **dbResult;

    int nRow, nColumn;

    int i , j;

    int index;

   

    if (argc != 2)

    {

           fprintf(stderr, "Usage: %s <db_file>\n", argv[0]);

           return -1;

    }

    result = db_init(argv[1], &db);

    if(result != DB_OK)

    {

       //failed to open database

      return -1;

    }

    result = db_sql( db, "select * from table1", &dbResult, &nRow, &nColumn, &errmsg );

    if(DB_OK == result)

    {

        // SQL operation is success

       

        // dbResult 的字段值是连续的,从第0索引到第 nColumn - 1索引都是字段名称,从第 nColumn 索引开始才是字段值                        

        index = nColumn;

       

        printf("found %d record\n", nRow);

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

        {

           printf("record %d\n", i+1);

           for( j = 0 ; j < nColumn; j++ )

           {

              printf("segment name:%s \t\tsegment value:%s\n", dbResult[j], dbResult[index]);

              ++index;

           }

           printf("-------\n");

        }

     }

     db_term(db, dbResult);

    

     return 0;

}

/* Makefile */

OBJ+=app

SRC+=db.c test_db.c

CFLAG=-lsqlite3 -L. -I.

CC=gcc

CROSS_COMPILE=ppc_8xx-

$(OBJ): $(SRC)

        $(CROSS_COMPILE)$(CC) -o $@ $^ $(CFLAG)

clean:

        rm -rf $(OBJ)

你可能感兴趣的:(sql,sqlite,table,平台,makefile)