嵌入式数据库sqlite在ARM上的的移植和使用
参考http://blog.csdn.net/whz_zb/article/details/7610571,如有侵权,请告知删除。
参考:头文件路径问题 https://www.cnblogs.com/linuxbo/p/4301716.html
参考:进一步学习资源 http://www.cnblogs.com/likebeta/tag/SQlite/
一、源码获取
http://sqlite.org/download.html
二、移植步骤
(1)下载和复制数据库sqlite-autoconf-3210000.tar.gz至目录/tmp/mysql。
(2)解压:tar –zxvf sqlite-autoconf-3210000.tar.gz,得到sqlite-autoconf-3210000。
(3)新建某个目录,存放编译后生成的文件。我这里是/tmp/build。
(4)配置:进入sqlite-autoconf-3210000中,使用命令:
- ./configure --host=arm-linux(这里根据需要可以改为gcc,即省去该配置参数(删除--host),默认使用gcc) --prefix=/tmp/build。
- --host后面接的是编译工具,--prefix后面接的是用来存放配置文件的位置。
(5)编译和安装:make之后再make install安装。
(6)移植:编译好后在build目录中会生成4个文件夹“bin 、include 、lib 、share”。将bin文件夹中的文件拷贝到开发板的/bin中,并将lib中的文件拷贝到开发板的/lib中。
(7)检验是否移植成功:输入sqlite3 test.db。如果成功会打印
三、常用命令
1、新建一个数据库
- sqlite3 xxx.db(假定这里xxx.db是zieckey.db)
2、创建表和插入值
(1)可以用CREATE TABLE语法命令。
- CREATE TABLE语句基本上就是"CREATE TABLE"关键字后跟一个新的表名以及括号内的一堆定义和约束。
- 表名可以是字符串或者标识符。以"sqlite_"开头的表名是留给sqlite数据库引擎使用的。
- 每个字段的定义是字段名后跟字段的数据类型,接着是一个或多个的字段约束。字段的数据类型并不限制字段中可以存放的数据。
(2)实例
sqlite> CREATE TABLE SensorData(
...> ID INTEGER PRIMARY KEY,
...> SensorID INTEGER,
...> SiteNum INTEGER,
...> Time VARCHAR(12),
...> SensorParameter REAL
...> );
3、查看所创建的表
(1).schema 是用来查看数据库中所有的表的定义内容。如果后面跟了具体的表名称,则显示该表的内容。
(2)实例
sqlite> .schema
CREATE TABLE SensorData(
ID INTEGER PRIMARY KEY,
SensorID INTEGER,
SiteNum INTEGER,
Time VARCHAR(12),
SensorParameter REAL
);
sqlite>
3、向表中插入具体元素值
sqlite> INSERT INTO "SensorData" VALUES(2, 1, 0, '200605011306', 16.4);
sqlite> INSERT INTO "SensorData" VALUES(3, 1, 0, '200605011406', 15.3);
sqlite> INSERT INTO "SensorData" VALUES(4, 1, 0, '200605011506', 15.5);
4、在线帮助:.help
5、查看当前数据库下的所有表:.table
6、退出sqlite3:.quit
四、linux下用c语言操作数据库
1、调用 sqlite 的 API 接口函数示例
(1)移植好sqlite。
(2)先创建如下文件test.c
// name: opendbsqlite.c
// This prog is used to test C/C++ API for sqlite3.It is very simple,ha!#include <stdio.h>
#include "sqlite3.h"int main( int argc, char **argv )
{char *file = "database.sqlite3";sqlite3 *pDB = NULL;int rc = 0;sqlite3_initialize( );rc = sqlite3_open_v2( file, &pDB, SQLITE_OPEN_READWRITE |SQLITE_OPEN_CREATE, NULL );if ( rc != SQLITE_OK){sqlite3_close_v2( pDB );}/* perform database operations */sqlite3_close_v2( pDB );}
(2)然后
root@ubuntu:/tmp# gcc test.c -lsqlite3 -L/tmp/build/lib/ -I/tmp/build/include/
root@ubuntu:/tmp# ls
a.out build mysql ssh-KQYQ2kfL2MIM test.c VMwareDnD vmware-root vmware-root-859941367 vmware-xjh wifi_test
root@ubuntu:/tmp# ./a.out
root@ubuntu:/tmp# ls
a.out build database.sqlite3 mysql ssh-KQYQ2kfL2MIM test.c VMwareDnD vmware-root vmware-root-859941367 vmware-xjh wifi_test
root@ubuntu:/tmp#
2、向数据库插入数据
(1)代码
// name: insert.c
// This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
#define _DEBUG_int main( void )
{sqlite3 *db=NULL;char *zErrMsg = 0;int rc;char *sql;rc = sqlite3_open("zieckey.db", &db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 0;}else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");//创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中sql = "CREATE TABLE SensorData(\ID INTEGER PRIMARY KEY, \SensorID INTEGER, \SiteNum INTEGER, \Time VARCHAR(12), \SensorParameter REAL \);";sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );//插入数据 sql = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '201205011206', 18.9 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"SensorData\" VALUES( NULL , 1 , 1 , '201205011306', 16.4 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sqlite3_close(db); //关闭数据库return 0;
}
(2)然后
root@ubuntu:/tmp# ./build/bin/sqlite3 zieckey.db
SQLite version 3.21.0 2017-10-24 18:55:49
Enter ".help" for usage hints.
sqlite> select * from SensorData;//这里记得有分号
1|1|1|201205011206|18.9
2|1|1|201205011306|16.4
sqlite>
3、查询数据库中的数据
(1)代码
// name: query.c
// This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
#define _DEBUG_int main( void )
{sqlite3 *db=NULL;char *zErrMsg = 0;int rc;rc = sqlite3_open("zieckey.db", &db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 0;}else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");//创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中char *sql = " CREATE TABLE SensorData(\ID INTEGER PRIMARY KEY,\SensorID INTEGER,\SiteNum INTEGER,\Time VARCHAR(12),\SensorParameter REAL\);" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endif//插入数据 sql = "INSERT INTO \"SensorData\" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"SensorData\" VALUES(NULL , 1 , 1 , '200605011306', 16.4 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );int nrow = 0, ncolumn = 0;char **azResult; //二维数组存放结果//查询数据/*int sqlite3_get_table(sqlite3*, const char *sql,char***result , int *nrow , int *ncolumn ,char **errmsg );result中是以数组的形式存放你所查询的数据,首先是表名,再是数据。nrow ,ncolumn分别为查询语句返回的结果集的行数,列数,没有查到结果时返回0*/sql = "SELECT * FROM SensorData ";sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );int i = 0 ;printf( "row:%d column=%d \n" , nrow , ncolumn );printf( "\nThe result of querying is : \n" );for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )printf( "azResult[%d] = %s\n", i , azResult[i] );//释放掉 azResult 的内存空间sqlite3_free_table( azResult );#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endifsqlite3_close(db); //关闭数据库
return 0;}
(2)然后
root@ubuntu:/tmp# ./a.out
You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun ! ^-^
zErrMsg = table SensorData already exists
row:4 column=5
The result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 1
azResult[7] = 1
azResult[8] = 201205011206
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 1
azResult[12] = 1
azResult[13] = 201205011306
azResult[14] = 16.4
azResult[15] = 3
azResult[16] = 1
azResult[17] = 1
azResult[18] = 200605011206
azResult[19] = 18.9
azResult[20] = 4
azResult[21] = 1
azResult[22] = 1
azResult[23] = 200605011306
azResult[24] = 16.4
zErrMsg = (null)
root@ubuntu:/tmp#
(3)分析
azResult 的前面 5 个数据正好是我们的表 SensorData 的列属性,之后才是我们要查询的数据。
所以我们的程序中才有 i<( nrow + 1 ) * ncolumn 的判断条件:
for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )
printf( "azResult[%d] = %s\n", i , azResult[i] );
输出中有 zErrMsg = (null) 这样的字句,这是 zErrMsg 保留的错误信息,zErrMsg 为空,表明在执行过程中没有错误信息。
4、删除数据库中的特定的数据
(1)代码
// name: delete.c
// This prog is used to test C/C++ API for sqlite3 .It is very simple,ha !#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
#define _DEBUG_int main( void )
{sqlite3 *db=NULL;char *zErrMsg = 0;int rc;rc = sqlite3_open("zieckey.db", &db); //打开指定的数据库文件,如果不存在将创建一个同名的数据库文件if( rc ){fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));sqlite3_close(db);return 0;}else printf("You have opened a sqlite3 database named zieckey.db successfully!\nCongratulations! Have fun ! ^-^ \n");//创建一个表,如果该表存在,则不创建,并给出提示信息,存储在 zErrMsg 中char *sql = " CREATE TABLE SensorData(\ID INTEGER PRIMARY KEY,\SensorID INTEGER,\SiteNum INTEGER,\Time VARCHAR(12),\SensorParameter REAL\);" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endif//插入数据 sql = "INSERT INTO \"SensorData\" VALUES(NULL , 1 , 1 , '200605011206', 18.9 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"SensorData\" VALUES(NULL , 23 , 45 , '200605011306', 16.4 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );sql = "INSERT INTO \"SensorData\" VALUES(NULL , 34 , 45 , '200605011306', 15.4 );" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );int nrow = 0, ncolumn = 0;char **azResult; //二维数组存放结果//查询数据sql = "SELECT * FROM SensorData ";sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );int i = 0 ;printf( "row:%d column=%d \n" , nrow , ncolumn );printf( "\nThe result of querying is : \n" );for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )printf( "azResult[%d] = %s\n", i , azResult[i] );//删除数据sql = "DELETE FROM SensorData WHERE SensorID = 1 ;" ;sqlite3_exec( db , sql , 0 , 0 , &zErrMsg );#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endifsql = "SELECT * FROM SensorData ";sqlite3_get_table( db , sql , &azResult , &nrow , &ncolumn , &zErrMsg );printf( "\n\n\n\nrow:%d column=%d " , nrow , ncolumn );printf( "\nAfter deleting , the result of querying is : \n" );for( i=0 ; i<( nrow + 1 ) * ncolumn ; i++ )printf( "azResult[%d] = %s\n", i , azResult[i] );//释放掉 azResult 的内存空间sqlite3_free_table( azResult );#ifdef _DEBUG_printf("zErrMsg = %s \n", zErrMsg);#endifsqlite3_close(db); //关闭数据库return 0;}
(2)然后
root@ubuntu:/tmp# gcc test.c -lsqlite3 -L/tmp/build/lib/ -I/tmp/build/include/
root@ubuntu:/tmp# ./a.out
You have opened a sqlite3 database named zieckey.db successfully!
Congratulations! Have fun ! ^-^
zErrMsg = table SensorData already exists
row:7 column=5
The result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 1
azResult[6] = 1
azResult[7] = 1
azResult[8] = 201205011206
azResult[9] = 18.9
azResult[10] = 2
azResult[11] = 1
azResult[12] = 1
azResult[13] = 201205011306
azResult[14] = 16.4
azResult[15] = 3
azResult[16] = 1
azResult[17] = 1
azResult[18] = 200605011206
azResult[19] = 18.9
azResult[20] = 4
azResult[21] = 1
azResult[22] = 1
azResult[23] = 200605011306
azResult[24] = 16.4
azResult[25] = 5
azResult[26] = 1
azResult[27] = 1
azResult[28] = 200605011206
azResult[29] = 18.9
azResult[30] = 6
azResult[31] = 23
azResult[32] = 45
azResult[33] = 200605011306
azResult[34] = 16.4
azResult[35] = 7
azResult[36] = 34
azResult[37] = 45
azResult[38] = 200605011306
azResult[39] = 15.4
zErrMsg = (null)
row:2 column=5
After deleting , the result of querying is :
azResult[0] = ID
azResult[1] = SensorID
azResult[2] = SiteNum
azResult[3] = Time
azResult[4] = SensorParameter
azResult[5] = 6
azResult[6] = 23
azResult[7] = 45
azResult[8] = 200605011306
azResult[9] = 16.4
azResult[10] = 7
azResult[11] = 34
azResult[12] = 45
azResult[13] = 200605011306
azResult[14] = 15.4
zErrMsg = (null)
root@ubuntu:/tmp#
(3)分析
从程序输出结果就可以看出,在删除数据前,我们有三条记录,删除数据后我们发现,数据库内记录少了,从而实现了我们的删除数据目的。
嵌入式数据库sqlite在ARM上的的移植和使用相关推荐
- Linux网络编程小项目sqlite,嵌入式数据库sqlite
*************************************** * 嵌入式数据库sqlite在LPC22XX上的应用 * ******************************* ...
- 嵌入式数据库Sqlite移植教程-转
嵌入式数据库Sqlite移植教程 sqlite-3.3.6编译安装与交叉编译全过程详细记录 本文介绍的内容都是基于 Linux RedHat 9.0 平台的. 一.PC机编译安装 请阅读在安装包里的 ...
- 嵌入式数据库SQLite的编译、安装和使用[ZT]
嵌入式数据库SQLite的编译.安装和使用 下文介绍的内容都是基于 RedHat Linux 9.0 平台的. 引言:sqlite简介 sqlite是嵌入式SQL数据库引擎SQLite(SQLite ...
- 【嵌入式实验】《嵌入式数据库 sqlite 移植及使用》
嵌入式数据库 sqlite 移植及使用 一.实验目的 二.实验内容 三.预备知识 四.实验设备及工具(包括软件调试工具) 五.实验步骤 实验一:移植嵌入式数据库 sqlite 1~5:安装 sqlit ...
- 南京邮电大学嵌入式系统开发实验3:嵌入式数据库sqlite移植及使用
实验3 嵌入式数据库sqlite移植及使用 一.实验目的 理解嵌入式软件移植的基本方法,掌握sqlite数据库软件移植的步骤,掌握sqlite开发的两种方式-命令模式和C代码开发模式的使用方法,并编 ...
- Sqlite 移动嵌入式数据库Sqlite的日常SQL操作语句汇总
序言: 嵌入式数据库Sqlite的基本sql使用汇总,使用测试起来,与关系型数据库mysql在语法上有很多的相似之处,先准备测试数据: CREATE TABLE COMPANY(ID INT ...
- 嵌入式数据库SQLite与Java
嵌入式数据库SQLite与Java SQLite作为一个开源的嵌入式数据库产品,具有系统开销小,检索效率高的特性,适用于手机.PDA.机顶盒设备等电器,并且作为嵌入式数据库在可下载的消费类应用程序中运 ...
- android 内嵌 数据库,安卓开发之嵌入式数据库sqlite的操作方法
安卓App开发经常会需要嵌入式数据库sqlite的辅助,它可以存放我们必要的应用数据,下面介绍下如何使用java连接读取sqlite中的数据. 本文中的代码经本人测试可用,可以参考. 代码如下: DB ...
- Java与嵌入式数据库SQLite的结合
为什么80%的码农都做不了架构师?>>> 最近研究了一下嵌入式数据库,并使用Java与一个叫做SQLite的轻量级数据库结合写了个小程序,这个过程中也获得了不少经验,下面来总结 ...
最新文章
- shell中定义变量用双引号和单引号以及不用引号的区别
- Eclipse启动项目时,删除workspaces无用的工作区间
- VTK:几何对象之ParametricSuperToroid
- Yii 2.0高级版 下拉框预设值、默认值
- 吴裕雄 python 神经网络——TensorFlow训练神经网络:不使用隐藏层
- 借助桶排序思想完成的一道题
- 自学it18大数据笔记-第二阶段hadoop-day11——会持续更新……
- python读取图像并相加_python给图像加上mask,并提取mask区域实例
- electron 前端开发桌面应用
- 寻找点赞所需的URL
- 最长单调递增子序列——动态规划
- 2022-2027年中国氮化硼行业市场运行现状及投资战略研究报告
- 手机tim邮箱服务器密码错误,qq邮箱登录失败显示session timeout解决方法
- 人人网(cookie登录)
- IPCAM视频数据解码并处理
- 360极速浏览器取消默认迅雷下载的正确方法
- 教你如何在vue-cli项目打包时避免踩雷(一)【早看早受益】
- java中break用法
- 苹果6s照相快门声音设置_苹果6S Plus被摔后不能照相听简无声音多故障维修
- 英语年份怎么读(2008怎么读)