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

Posted DS小龙哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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追求的首要目标,但是其功能和性能都非常出色,它具有这样一些特性:

  1. 支持ACID事务(ACID是Automic、Consisten、Isolated和Durable的缩写)
  2. 零配置,不需要任何管理性的配置过程
  3. 支持SQL92标准
  4. 所有数据存放单独的文件中,支持的最大文件可达2TB
  5. 数据库可以在不同字节的机器间共享
  6. 体积小
  7. 系统开销小,检索效率高
  8. 简单易用的API接口
  9. 可以和TCL、Python、C/C++、JAVA、Ruby、Lua、Perl、php等多种语言绑定
  10. 自包含,不依赖于外部支持
  11. 良好注释的代码
  12. 代码测试覆盖率高达95%以上
  13. 开放源码,可用于任何合法途径

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

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

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

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

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

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

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

2.1 SQLite数据库下载

下载地址:  SQLite Home Page

 

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

[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数据库交叉编译部署与运用的主要内容,如果未能解决你的问题,请参考以下文章

交叉编译SQLite3

交叉编译Python-2.7.13到ARM(aarch32)—— 支持sqlite3

交叉编译sqlcipher

PHP的MIPS交叉编译

怎样交叉编译WebRtc到ARM Linux

交叉编译Python-3.6.0到aarch64/aarch32 —— 支持sqlite3