您的位置:首页 > 运维架构 > Linux

SQLite3嵌入式数据库arm+linux移植

2016-05-10 17:58 423 查看

SQLite数据库介绍

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

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

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

SQLite移植

1、下载sqlite3源代码
http://sqlite.org/download.html
2、解压源代码

tar xvzf sqlite-amalgamation-3.6.1.tar.gz

3、配置交叉编译到arm linux平台

./configure --prefix=/home/rootfs/home/sqlite  --target=arm-linux  --host=arm-linux

--host:指定交叉编译工具,一般为arm-linux、arm-linux-gnueabihf、arm-none-linux-gnueabi等,具体要和板子用的交叉编译工具对应
--prefix:指定安装目录,编译后的文件会全部放在安装目录中。必须是绝对路径
4、编译

make

5、安装

make install

头文件和生成的库文件将安装到指定的目录中(拷贝)

6、编写自己的数据库应用

#i nclude 

#i nclude 
 
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
  int i;
  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;
  char *zErrMsg = 0;
  int rc;
 
  if( argc!=2 ){
    fprintf(stderr, "Usage: %s DATABASE \n", argv[0]);
    return 0;
  }
  rc = sqlite3_open(argv[1], &db);
  if( rc ){
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return 0;
  }
 
  char *sql = " CREATE TABLE SensorData(               \
                        ID       INTEGER PRIMARY KEY,  \
                        SensorID INTEGER,              \
                        SiteNum  INTEGER,              \
                        Time     VARCHAR(12),          \
                        SensorParameter REAL           \
                );";
   //使用sql字符串指定的sql语言 创建数据表SensorData
  sqlite3_exec( db , sql , 0 , callback , &zErrMsg );  
 
   //插入数据到数据表
  sql = "INSERT INTO  'SensorData'  VALUES(1 , 1 , 1 , '200605011306', 16.4 );" ;
  sqlite3_exec( db , sql , 0 , callback , &zErrMsg );
 
  int nrow = 0, ncolumn = 0;
  char **azResult;
  int i;
  sql = "SELECT * FROM SensorData ";
  sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );
 
  printf( "row:%d column=%d" , nrow , ncolumn );
  printf( "The result of querying is :" );
  for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ ){
     printf( "azResult[%d] = %s \r\n", i , azResult[i] );
  }
 
  sqlite3_free_table( azResult );
 
  if( rc!=SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
        sqlite3_free(zErrMsg);
  }
  sqlite3_close(db);
 
  return 0;
}
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Libs = -L${libdir} -lsqlite3 -lpthread
Cflags = -I${includedir}
 
CROSS_COMPILE = arm-linux-
CC = $(CROSS_COMPILE)gcc
LD = $(CROSS_COMPILE)ld
 
radiodb: radiodb.o
        $(CC) $^ $(Libs)  -o $@
radiodb.o:radiodb.c
        $(CC) $(Cflags) -c $^ -o $@
clean:
        rm -rf radiodb  *.o
in:
        cp radiodb /home/rootfs/home/sqlite

  sql = "INSERT INTO 'SensorData' VALUES( 0 , 1 , 1 ,  '200605011206', 18.9 );" ;

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

   //插入数据到数据表

  //从数据表查询数据

7. 编写Makefile

 prefix=/home/rootfs/home/sqlite

   注意makefile里的红色字体内容可以在sqlite安装目录的lib下的pkconfig下的文件查得。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: