Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1552047
  • 博文数量: 239
  • 博客积分: 1760
  • 博客等级: 上尉
  • 技术积分: 1595
  • 用 户 组: 普通用户
  • 注册时间: 2011-01-08 23:53
文章分类

全部博文(239)

文章存档

2016年(1)

2015年(28)

2014年(53)

2013年(42)

2012年(50)

2011年(65)

分类: LINUX

2014-02-18 15:55:43

原文地址:fedora10下SQLite的移植 作者:aoyang888

SQLite的配置和使用文档 二.软硬件平台:

OS                          fedora10

编译器:                  gcc 版本 4.1.2 20070502 (Red Hat 4.1.2-12)

开发板:                  基于Sep4020UB4020EVB(1.6) 开发套件;

Linux内核:           Linux Kernel v2.6.16

交叉编译器:          gcc version 3.4.1

Sqlite                            sqlite-3.3.8

三.PC端编译环境的安装:

此处使用的为SQLite版本为sqlite-3.3.8.tar.gz,可以通过以下方式获得此压缩包(利用迅雷等工具下载)。

将此压缩包拷贝到   /root目录下,在终端中进入此目录,并解压sqlite-3.3.8.tar.gz压缩包:

[root@localhost ~]# cd /root/

[root@localhost ~]# tar -zxvf sqlite-3.3.8.tar.gz

sqlite-3.3.8更名为sqlit_pc,并进入sqlite_pc目录:

[root@localhost ~]# mv sqlite-3.3.8 sqlite_pc

[root@localhost ~]# cd sqlite_pc

//进入目录后采用默认配置生成Makefile文件:

[root@localhost sqlite_pc]# ./configure

配置结束后进行编译并且将所生成的文件安装:

[root@localhost sqlite_pc]# make

[root@localhost sqlite_pc]# make install

Make install 安装以后会生成以下文件,系统默认的目录为 /usr/local:

lib             libsqlite3.a    libsqlite3.la   libsqlite3.so  libsqlite3.so.0                                                libsqlite3.so.0.8.6

include     sqlite3.h

bin:               sqlite3

由于/usr/local为系统路径,此时只要在终端直接输入sqlite3 [数据库名]    即可打开(没有时创建)一个数据库文件。

1:在终端输入以下语句:

[root@localhost sqlite-3.3.8]# sqlite3 prochip.db

SQLite version 3.3.8

Enter ".help" for instructions

sqlite>

此时就会正确的打开(没有时创建)prochip.db数据库文件

sqlite> .e

退出数据库操作,具体的数据库操作在后节会有示例。

四.交叉编译环境下SQLite的安装:

此处使用的为SQLite版本为sqlite-3.3.8.tar.gz,可以通过以下方式获得此压缩包(利用迅雷等工具下载)。

将此压缩包拷贝到   /usr/local/arm目录下,在终端中进入此目录,并解压sqlite-3.3.8.tar.gz压缩包:

[root@localhost sqlite_pc]# cd /usr/local/arm/

[root@localhost arm]# tar -zxvf sqlite-3.3.8.tar.gz

将此目录更名为sqlite_arm,然后进入此目录:

[root@localhost arm]# mv sqlite-3.3.8 sqlite_arm

[root@localhost arm]# cd sqlite_arm

与在PC环境下编译SQLite3不同,不能通过sqlite_arm目录下的configure脚本来生成Makefile文件。而是必须手动修改Makefile文件。在sqlite_arm目录下有一个Makefile范例文件Makefile.linux-gcc

首先通过下面的命令拷贝此文件并重命名为Makefile

[root@localhost sqlite_arm]# cp Makefile.linux-gcc Makefile

利用gedit打开Makefile文件并手动修改Makefile文件的内容。

[root@localhost sqlite_arm]#gedit Makefile

找到Makefile文件中的下面这样一行(line    17):

TOP = ../sqlite

将其修改为:

TOP = .

找到下面这样一行(line  73):

TCC = gcc -O6

将其修改为:

TCC = arm-linux-gcc -O6

找到下面这样一行(line  81)

AR = ar cr

将其修改为:

AR = arm-linux-ar cr

找到下面这样一行(line  83)

RANLIB = ranlib

将其修改为:

RANLIB = arm-linux-ranlib

找到下面这样一行(line  86):

MKSHLIB = gcc -shared

将其修改为:

MKSHLIB = arm-linux-gcc -shared

找到下面这样一行(line  96):

TCL_FLAGS = -I/home/drh/tcltk/8.4linux

将其修改为:

#TCL_FLAGS = -I/home/drh/tcltk/8.4linux

注释掉下面这一行(line  103):

LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm –ldl

将其修改为:

#LIBTCL = /home/drh/tcltk/8.4linux/libtcl8.4g.a -lm –ldl

原则上,对Makefile的修改主要包括两个方面:首先是将编译器、归档工具等换成交叉工具链中的对应工具,比如:gcc换成arm-linux-gccar换成ar-linux-arranlib arm-linux-ranlib等等;其次是去掉与TCL相关的编译选项,因为默认情况下,将会编译SQLite3Tcl语言绑定,但是在移植到ARM-Linux的时候并不需要,因此将两个与TCL有关的行注释掉。

关闭并保存Makefile文件。

然后通过下面的命令修改main.mk文件,因为Makefile包含了这个文件。

[root@localhost sqlite_arm]# gedit main.mk

找到这个文件中的下面一行(line  63):

select.o table.o tclsqlite.o tokenize.o trigger.o \

把它替换成:

select.o table.o tokenize.o trigger.o \

也就是把该行上的tclsqlite.o去掉。这样编译的时候将不会编译SQLite3Tcl语言绑定。

自此,修改工作就完成了,接下来就可以开始编译SQLite3了,这通过make命令即可完成:

[root@localhost sqlite_arm]# make

编译完成之后,将在sqlite_arm目录下生成一下文件:

库函数文件:    libsqlite3.a

头文件:            sqlite3.h

应用程序;           sqlite3

此时将sqlite3应用程序拷贝到文件系统的系统路径 bin目录下,这样就可以在嵌入式开发平台上使用SQLite了。

2:打开嵌入式开发平台,在串口终端中输入语句。

/# sqlite3 prochip.db

SQLite version 3.3.8

Enter ".help" for instructions

sqlite>

此时就会正确的打开(没有时创建)prochip.db数据库文件

sqlite> .e

退出数据库操作,具体的数据库操作在后节会有示例。

注:在嵌入式环境和PC环境下生成数据库文件的存储格式是相同的,在PC端和嵌入式端可以操作同一个数据库。

注:整个过程也可以使用命令:./configure --host=arm-linux --prefix=/root/sqlite-3.6.22/build/target --disable-tcl(修改的报错率低,也是对编译的一个很好的理解)

还有要注意板子所支持的交叉编译工具,有的板子arm-linux-gcc4.0以上都不识别。

还有什么问题可以相互交流。。。。。。

五.SQLite命令行功能的使用介绍:

SQLite的的使用中,在sqlite>下,我们可以直接使用一些命令行来直接对数据库进行操作,也可以直接输入标准的SQL语言来进行操作。下面就介绍一些简单的命令行和SQL语句的使用方式:

5.1  SQL语言:

1.建立表:  sqlite> create table test(name varchar(10),age smallint);

2.插入表:  sqlite> insert into test values("prochip",5);

3.查询表:  sqlite> select * from test;

prochip|5

       4.修改表记录:sqlite> update test set age = 6 where name = "prochip";

       5.删除表记录:sqlite> delete from test where name = "prochip";

       6.删除表;            sqlite> drop table test;

5.2  命令行语言:

1 .help查看命令行的帮助文件

sqlite> .help

.bail ON|OFF           Stop after hitting an error.  Default OFF

.databases             List names and files of attached databases

.dump ?TABLE? ...      Dump the database in an SQL text format

……

.width NUM NUM ...     Set column widths for "column" mode

2.tables     第一步建立好表后,可以通过此语句来查看已经存在的表:

sqlite> .tables

test

3.dump    第一步建立好表后,可以通过此语句生成数据库表的SQL脚本:

sqlite> .dump

BEGIN TRANSACTION;

CREATE TABLE test(name varchar(10),age smallint);

INSERT INTO "test" VALUES('prochip',5);

COMMIT;

4.schema ?TABLE?

第一步建立好表后,可以通过此语句生成形成数据库表的SQL脚本:

sqlite> .schema test

CREATE TABLE test(name varchar(10),age smallint);

5.quit  或者 .exit 退出命令行窗口。

sqlite>. quit

六.SQLite应用程序的编写:

前面介绍了SQlite的安装和命令的使用,下面介绍在应用程序中进行数据库的操作。在正常的应用程序的操作中主要包含三种操作:增加、查询和修改,下面即介绍三个测试用例来分别介绍。

例一:创建数据库和表

#include

#include

#include "sqlite3.h"                                                     //包含SQLite的头文件

int main( void )

{

       sqlite3   *db=NULL;

       char       *zErrMsg = 0;

       int rc;

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

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

 

       if( rc )                                //如果出错,给出提示信息并退出程序

{

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

              sqlite3_close(db);

              exit(1);

       }

       else

       {

printf("You have opened a sqlite3 database named prochip.db successfully!\n");

}

       char *sql = "CREATE TABLE TestTable(ID INTEGER PRIMARY KEY,\

Name TEXT,Amount INTEGER);";                           

       sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );                                 //创建一个表

 

       sql = "INSERT INTO \"TestTable\" VALUES( 001 ,'nokia', 39);" ;

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

       sql = "INSERT INTO \"TestTable\" VALUES( 002 , 'iphone' , 26);" ;

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

       sql = "INSERT INTO \"TestTable\" VALUES( 003 , 'palm' , 11);" ;

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

 

       sqlite3_close(db);                                                                             //关闭数据库

       return 0;

}

例二:查询数据库操作:

#include

#include

#include "sqlite3.h"                                                     //包含SQLite的头文件

int main( void )

{

      sqlite3 *db=NULL;

       char *zErrMsg = 0;

       int rc;

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

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

 

       if( rc )                                //如果出错,给出提示信息并退出程序

{

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

              sqlite3_close(db);

              exit(1);

       }

       else

       {

printf("You have opened a sqlite3 database named prochip.db successfully!\n");

}

 

       int nrow = 0, ncolumn = 0;                                          //保存获取信息的行数和列数

       int i,  j;

       char **azResult;                                                         //二维数组存放结果

 

       char *sql = "SELECT ID,name,Amount FROM TestTable;";

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

 

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

       {

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

              {

                     printf("%s\t\t",azResult[nrow * i + j]);                  //打印查询信息

              }

              printf("\n");

       }

sqlite3_close(db);                                                                      //关闭数据库

return 0;

}

例三:修改数据库操作:

#include

#include

#include "sqlite3.h"                                                     //包含SQLite的头文件

int main( void )

{

      sqlite3 *db=NULL;

       char *zErrMsg = 0;

       int rc;

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

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

 

       if( rc )                                //如果出错,给出提示信息并退出程序

{

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

              sqlite3_close(db);

              exit(1);

       }

       else

       {

printf("You have opened a sqlite3 database named prochip.db successfully!\n");

}

      

       char *sql = "UPDATE TestTable SET Amount=\"100\" WHERE ID = 002;";

       sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );                          //跟新数据库

      

       sqlite3_close(db); //关闭数据库

       return 0;

}

七.应用程序的编译和运行: 7.1  PCSQLite的编译和运行

由于在PC端的sqlit3存在于系统路径中,所以在编译应用程序时,只需加上sqlite的库文件即可。

PC机终端输入:

[root@localhost test]# gcc -o insert insert.c -lsqlite3

[root@localhost test]# ./insert

You have opened a sqlite3 database named prochip.db successfully!

[root@localhost test]# sqlite3 prochip.db

SQLite version 3.3.13

Enter ".help" for instructions

sqlite> select ID,Name,Amount from TestTable;

1|nokia|39

2|iphone|26

3|palm|11

sqlite>

其它操作类似。

7.2  嵌入式SQLite的编译和运行

由于在交叉编译时,SQLite的库文件和应用程序都保存于/usr/local/arm/sqlite_arm目录下,因此我们只要在编译时将库文件和头文件都指定到这个目录即可,如在PC端终端输入:

[root@localhost ~]#arm-linux-gcc -o insert_arm insert.c -lsqlite3  -I/usr/local/arm/sqlite_arm/ -L /usr/local/arm/sqlite_arm/

到开发板启动后的串口终端中输入:

/test # ./insert_arm

You have opened a sqlite3 database named prochip.db successfully!

/test # sqlite3 prochip.db

SQLite version 3.3.8

Enter ".help" for instructions

sqlite> select ID,Name,Amount from TestTable;

1|nokia|39

2|iphone|26

3|palm|11

sqlite>

其它操作类似。

阅读(1383) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~