sqlite3数据库移植详解

前言

  本文讲述sqlite3数据库的嵌入式设备移植过程并结合小例子说明如何使用sqlite3的库进行编程。数据库在程序开发过程中起到举足轻重的作用,肩负着用户和系统设置数据的保存、查找、增删等操作,是程序运行的“粮食“。数据库的提供商有很多,诸如oracle、candence、mysql、sqlite等。但是sqlite3作为一款高可靠性且小巧玲珑的数据库工具,以及它的跨平台特性使得它十分适合在嵌入式领域使用。本文以海思Hi35xx系列嵌入式平台为目标,实现sqlite3的嵌入式移植,并使平台具有数据库开发的能力,方便保存用户信息及音视频配置信息。


源码下载

  Sqlite官网提供了源码下载衔接,进入下载页面发现 sqlite提供了多个版本,由于我们需要嵌入式移植,应当选择源码进行下载,分别点击sqlite-amalgamation-3230100.zip、sqlite-autoconf-3230100.tar.gz进行下载保存即可。

源码编译

  将下载的两个包拷贝到宿主机,并进行解压缩。进入sqlite-autoconf-3230100后执行以下指令生成Makefile文件:

./configure CC=arm-hisiv400-linux-gcc--host=arm-hisiv400-linux--prefix=/home/rong//share/lishuangliang/sqlite/install

  其中CC指定嵌入式平台为arm-hisiv400-linux-gcc即海思的Hi3536;host项指定主机;prefix项指定安装目录;需要注意的是每一项配置的等号两边不能有空格。接着运行make进行编译,待编译完成后运行make install进行安装,至此源码编译安装完成。




  接着将install/bin/sqlite3拷到目标机的/usr/bin目录下;将install/lib/下的所有库拷贝到目标机/usr/lib/下,至此sqlie3的嵌入式移植工作完成。接着写个小例使用验证验证一下sqlite3,需要注意一下的是,如果样例没有运行成功,请检查sqlite3的库是否完整,特别是里面的软连接库(拷贝的时候建议先压缩,拷到目标目录再解压缩),再或者export检查一下sqlite3的库是否加入系统的环境变量,没有则应相应追加上去。

运用样例

  Sqlite3运用实例很简单,就是创建一个学生信息表,然后执行数据库标准增删查改等操作。样例的源码结构很清晰,通过变量名,基本能看出其功用,这里就不用一一解析了。需要注意的是样例的编译时必须加上install/include里面的头文件和install/lib里面的库,否则编译失败,推荐使用一下的Makefile进行编译。

CC := arm-hisiv400-linux-gcc
INC_FLAGS := -I include
LIBS := ./lib/libsqlite3.a
LIBS += ./lib/libsqlite3.so
LIBS += ./lib/libsqlite3.so.0
LIBS += ./lib/libsqlite3.so.0.8.6

all:
	$(CC) $(INC_FLAGS) $(LIBS) mysqlite.c -o mysqlite 
clean:
	@rm -f mysqlite


#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"

void DbCreate_student(sqlite3 *db,char *TblName)
{
	char sql_cmd[512] = {0};
	char *err_msg = NULL;
	printf("====Database Create New Table :%s ====\n",TblName);
	sprintf(sql_cmd,"CREATE TABLE [%s](\
					[idx] INT(1) PRIMARY KEY NOT NULL,\
					[name] CHAR(64) NOT NULL,\
					[sex] CHAR(1) NOT NULL,\
					[age] INT(1) NOT NULL);",TblName);
	if(sqlite3_exec(db,sql_cmd,NULL,NULL,&err_msg) != SQLITE_OK)
	{
		printf("err_msg = %s %s %d\n",err_msg,__FILE__,__LINE__);	
	}
}

void DbInit_student(sqlite3 *db,char *TblName)
{
	char sql_cmd[512] = {0};
	char *err_msg = NULL;
	printf("====Database Init New Table :%s ====\n",TblName);
	sprintf(sql_cmd,"INSERT INTO %s VALUES (1,\"Li Xiao Ming\",\'m\',20);",TblName);
	if(sqlite3_exec(db,sql_cmd,NULL,NULL,&err_msg) != SQLITE_OK)
	{
		printf("err_msg = %s %s %d\n",err_msg,__FILE__,__LINE__);	
	}
	sprintf(sql_cmd,"INSERT INTO %s VALUES (2,\"Liu Xiao Ying\",\'w\',18);",TblName);
	if(sqlite3_exec(db,sql_cmd,NULL,NULL,&err_msg) != SQLITE_OK)
	{
		printf("err_msg = %s %s %d\n",err_msg,__FILE__,__LINE__);	
	}
}
void DbSelect_student(sqlite3 *db,char *TblName)
{
	char sql_cmd[512] = {0};
	int i = 0;
	int result = 0;
	char **dbResult;
	char *err_msg = NULL;
	int nRow = 0, nColumn = 0;
	printf("====Database Select Table :%s ====\n",TblName);
	sprintf(sql_cmd, "select * from %s",TblName);
	result = sqlite3_get_table(db, sql_cmd, &dbResult, &nRow, &nColumn, NULL);
	if(SQLITE_OK != result)
	{
		printf("err_msg = %s %s %d\n",err_msg,__FILE__,__LINE__);
		if(dbResult != NULL)
		{
			sqlite3_free_table(dbResult);
			dbResult =NULL;
		}
		return;
	}
	for(i=1;i<=nRow;i++)
	{
		printf("num: %d  name: %s  sex: %s  age: %d\n",atoi(dbResult[i*nColumn+0]),dbResult[i*nColumn+1],dbResult[i*nColumn + 2],atoi(dbResult[i*nColumn + 3]));
	}	
}
void DbUpdate_student(sqlite3 *db,char *TblName)
{
	char sql_cmd[512] = {0};
	char **dbResult;
	char *err_msg = NULL;
	sprintf(sql_cmd,"update %s set name='Li shuang',sex='m',age=22 where idx=1",TblName);	
	if(SQLITE_OK != sqlite3_exec(db, sql_cmd, NULL, NULL, &err_msg))
	{
		printf("err_msg = %s %s %d\n",err_msg,__FILE__,__LINE__);
		return;
	}
}
void DbDelete_student(sqlite3 *db,char *TblName)
{
	char sql_cmd[512] = {0};
	char **dbResult;
	char *err_msg = NULL;	
	printf("====Database Delete Table :%s ====\n",TblName);
	sprintf(sql_cmd,"delete from %s where idx=1",TblName);
	if(SQLITE_OK != sqlite3_exec(db, sql_cmd, NULL, NULL, &err_msg))
	{
		printf("err_msg = %s %s %d\n",err_msg,__FILE__,__LINE__);
		sqlite3_free_table(dbResult);
		return ;
	}
}
int main()
{
	sqlite3 *db = NULL;
	char *errmsg = 0;
	char sql_cmd[128] = {0};
	int rc ;
	rc = sqlite3_open("studentinfo.db",&db);
	if(rc)
	{
		fprintf(stderr,"can't open database:%s\n",sqlite3_errmsg(db));
		sqlite3_close(db);
		exit(1);
	}	
	printf("open studentinfo.db successfully\n");
	DbCreate_student(db,"student");
	DbInit_student(db,"student");
	DbSelect_student(db,"student");
	DbUpdate_student(db,"student");
	DbSelect_student(db,"student");
	DbDelete_student(db,"student");
	DbSelect_student(db,"student");
	sqlite3_close(db);
	return 0;
}

总结

  Hi35XX系列被广泛用于摄像头、NVR、XVR、DVR等开发,其中避免不了与用户等各种数据进行交互,有一个数据库支持是很有必要的,本文讲述了sqlite3的移植及样例使用,希望能给读者一个参考,原创不易,转载请说明出处。







猜你喜欢

转载自blog.csdn.net/dosthing/article/details/80559641