Linux应用开发: SQLite数据库交叉编译部署与运用

一、数据库介绍

1.1 数据库简介

数据库是以一定方式储存在一起、能与多个用户共享、具有尽可能小的冗余度、与应用程序彼此独立的数据集合,可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。


数据库是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放,是有一定的规则的,否则查询的效率会很低。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。即这个互联网世界就是数据世界。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。


1.2 常用数据库介绍

目前关系型数据库主要有MySQL、SQL Server、数蚕数据库、Oracle数据库。


MySQL:免费产品,中小企业使用广泛。


SQL Server:微软的商业化产品,微软SQL语句兼容性好,商业化成熟度高。


数蚕数据库:数蚕科技针对中小型企业的数据库,c++接口特性良好,SQL特性较弱。


Oracle 数据库:商业化程度最高的关系数据库, 优良的性能和企业扩展能力。


SQLite数据库:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,不需要在系统中配置。


1.3 sqlite数据库介绍

SQLite数据库是一种嵌入式数据库,他的目标是尽量简单,因此它抛弃了传统企业级数据库的种种复杂特性,只实现对于数据库而言的必备的功能。


尽管简单性是SQLite追求的首要目标,但是其功能和性能都非常出色,它具有这样一些特性:


支持ACID事务(ACID是Automic、Consisten、Isolated和Durable的缩写)

零配置,不需要任何管理性的配置过程

支持SQL92标准

所有数据存放单独的文件中,支持的最大文件可达2TB

数据库可以在不同字节的机器间共享

体积小

系统开销小,检索效率高

简单易用的API接口

可以和TCL、Python、C/C++、JAVA、Ruby、Lua、Perl、PHP等多种语言绑定

自包含,不依赖于外部支持

良好注释的代码

代码测试覆盖率高达95%以上

开放源码,可用于任何合法途径

1.4 sqlite数据库可视化管理工具下载

SQLite Administrator是一款轻量级的sqlite可视化工具,主要可用来管理SQLite数据库文件,可进行创建、设计和管理等操作,具有创建数据库、表、视图、索引、触发器、查询等内容的功能。


SQLite Administrator提供的代码编辑器具有自动完成和语法着色,支持中文,可用于记录个人资料及开发 SQLite 数据。


Linux应用开发: SQLite数据库交叉编译部署与运用

二、sqlite数据库编译安装(ARM)

目标:  将sqlite交叉编译后部署到嵌入式开发板环境下运行。


当前使用的目标开发板是: 友善之臂的tiny4412开发板,交叉编译器的版本是官方自带的4.5.1


宿主机采用的是Redhat6.3 、当然使用ubuntu、或者其他发行版都可以。


2.1 SQLite数据库下载

下载地址:  SQLite Home Page

Linux应用开发: SQLite数据库交叉编译部署与运用

Linux应用开发: SQLite数据库交叉编译部署与运用

 2.2 编译数据库(ARM)

[wbyq@wbyq pc_work]$ tar xvf /mnt/hgfs/linux-share-dir/sqlite-autoconf-3250200.tar.gz
[wbyq@wbyq pc_work]$ cd sqlite-autoconf-3250200/
[wbyq@wbyq sqlite-autoconf-3250200]$ ./configure --host=arm-linux --prefix=$PWD/install
[wbyq@wbyq sqlite-autoconf-3250200]$ make && make install
[wbyq@wbyq sqlite-autoconf-3250200]$ tree install
install
├── bin
│   └── sqlite3
├── include
│   ├── sqlite3ext.h
│   └── sqlite3.h
├── lib
│   ├── libsqlite3.a
│   ├── libsqlite3.la
│   ├── libsqlite3.so -> libsqlite3.so.0.8.6
│   ├── libsqlite3.so.0 -> libsqlite3.so.0.8.6
│   ├── libsqlite3.so.0.8.6
│   └── pkgconfig
│       └── sqlite3.pc
└── share
    └── man
        └── man1
            └── sqlite3.1
 
7 directories, 10 files
[wbyq@wbyq sqlite-autoconf-3250200]$

2.3 搭建编译环境和程序运行环境

 1. 将生成的库文件拷贝到开发板的lib目录下,方便开发板上执行包含数据库的可执行文件时,能找到动态库。

[wbyq@wbyq sqlite-autoconf-3250200]$ cp install/lib/*.so* /home/wbyq/rootfs/lib/ -dvf
"install/lib/libsqlite3.so" -> "/home/wbyq/rootfs/lib/libsqlite3.so"
"install/lib/libsqlite3.so.0" -> "/home/wbyq/rootfs/lib/libsqlite3.so.0"
"install/lib/libsqlite3.so.0.8.6" -> "/home/wbyq/rootfs/lib/libsqlite3.so.0.8.6"

 2. 为了交叉编译器在编译,包含数据库的源文件时,方便找到头文件和库文件,需要将生成的库文件和头文件分别拷贝到交叉编译目录下。

1.[wbyq@wbyq sqlite-autoconf-3250200]$ 
sudo cp 
install/lib/*.so* /home/wbyq/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/lib/ -dvf
 
[wbyq@wbyq sqlite-autoconf-3250200]$ 
sudo cp 
install/include/* /home/wbyq/work/arm-linux-gcc/opt/FriendlyARM/toolschain/4.5.1/arm-none-linux-gnueabi/sys-root/usr/include/ -fv

2.4 编写例子代码

#include <stdio.h>
#include <sqlite3.h>
 
/* callback函数只有在对数据库进行select, 操作时才会调用 */
static int select_callback(void *data, int argc, char **argv, char **azColName){
   int i;
   printf("%s", (char*)data);
   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;
    int err;
    char *zErrMsg=0;
 
    if(argc!=2)
    {
        printf("./app <数据库文件名称>\n");
        return 0;
    }
    
    /*1. 创建数据库*/
    err=sqlite3_open(argv[1],&db);
    if(err)
    {
        printf("Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        return 0;
    }
    /*2. 使用字符串形式构造SQL语言*/
    /*
    CREATE TABLE 是告诉数据库系统创建一个新表的关键字。CREATE TABLE 语句后跟着表的唯一的名称或标识
    */
    char *sql = " CREATE TABLE TempData(               \
                        ID          INT PRIMARY KEY,   \
                        DS18B20Name CHAR(7),           \
                        Number      INT,               \
                        Time        CHAR(12),          \
                        Data        FLOAT              \
                );";
    /*3. 使用sql字符串指定的sql语言 创建数据表SensorData*/
    sqlite3_exec(db,sql,0, select_callback , &zErrMsg );
 
    /*4. 插入多条数据到数据表*/
    sql = "INSERT INTO  'TempData'  VALUES(81,'DS18B20',3,'20191109114322',11.4);" ;
    sqlite3_exec(db,sql,0,select_callback,&zErrMsg );
 
    sql = "INSERT INTO  'TempData'  VALUES(84,'DS18B20',6,'20191109114323',22.4);" ;
    sqlite3_exec(db,sql,0,select_callback,&zErrMsg );
 
    sql = "INSERT INTO  'TempData'  VALUES(87,'DS18B20',9,'20191109114323',77.4);" ;
    sqlite3_exec(db,sql,0,select_callback,&zErrMsg );
    
    /*5. 关闭数据库*/
    sqlite3_close(db);
    printf("数据库关闭成功.\n");
    return 0;
}

2.5 程序编译测试

all:
    arm-linux-gcc sqlite_create.c -o app -lsqlite3
    cp app /home/wbyq/rootfs/code
    rm app -f

进入到开发板的控制台终端测试程序。 

Linux应用开发: SQLite数据库交叉编译部署与运用

上一篇:No resource found that matches the given name: attr


下一篇:String类的方法中常用的正则表达式