嵌入式数据库sqlite在ARM上的的移植和使用

参考SQLite的编译、安装和使用_whz_zb的博客-CSDN博客,如有侵权,请告知删除。

参考:头文件路径问题 Linux下的头文件搜索路径 - 心哲 - 博客园

参考:进一步学习资源 SQlite - 标签 - likebeta - 博客园

一、源码获取

SQLite Download Page

二、移植步骤

(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)分析

从程序输出结果就可以看出,在删除数据前,我们有三条记录,删除数据后我们发现,数据库内记录少了,从而实现了我们的删除数据目的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/461008.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贪心法

贪心法的证明 —归纳证明&#xff1a; —贪心法使用的条件是&#xff1a;最优子结构和贪心选择正确性 —贪心算法是一步一步实现的&#xff0c; —在归纳证明的时候&#xff0c;贪心的第一步贪心选择策略的正确性就是归纳基础&#xff0c;因为以后都是一个子问题的选取&#xf…

第一季5:Hi3518EV200的环境搭建

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、内容总结 本文讲述如何安装交叉编译工具链&#xff0c;与编译源码得到uboot、kernel、rootfs镜像文件。 &#xff08;1&#xff09;安装交叉编译工具链&#xff0c;主要是通过执行osdrv/opensou…

Android动画的实现 上

在Android系统中也能经常见到动画&#xff0c;那么如何实现动画效果呢&#xff1f;本文就来为大家介绍动画的实现方式。 Android中动画的实现分两种方式&#xff0c;一种方式是补间动画Tween Animation&#xff0c;就是说你定义一个开始和结束&#xff0c;中间的部分由程序运算…

第一季2:HI3518EV200的初体验(检测板子是否正常工作)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、检测步骤 1、设置PC主机有线网卡的ip地址设为192.168.1.10&#xff0c;关闭防火墙。 2、虚拟机桥接到有线网卡&#xff0c;并设置虚拟机的静态ip地址为192.168.1.141。 3、在uboot控制台设置ub…

第一季3:HI3518E方案整体架构介绍(硬件和软件支持)

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 1、硬件资源 &#xff08;1&#xff09;HI3518E单芯片提供&#xff1a;CPU DSP 内置64MB DDR ETHERNET MAC。 &#xff08;2&#xff09;外置16MB的SPI接口的Flash用来存放程序&#xff08;ubo…

(一)FlexViewer之整体框架解析

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/。 1.FlexViewer简介 FlexViewer框架为Esri提供的可以高效开发基于WEB的地理信息应用系统的一种完全免费的应用程序框架。目前有两种版本&#xff0c;一种…

三阶魔方复原操作方法

在女票的指导下&#xff0c;我花了一个晚上学习如何复原三阶魔方&#xff0c;虽然是知其然不知其所以然&#xff0c;但好歹也能把魔方复原了。下面都是一些傻瓜式的操作&#xff0c;里面涉及的理论我不清楚。魔方总共分三层&#xff0c;下面是每层复原方法。 第一层 1、先以“…

Phaser开源2d引擎 javascript/html5游戏框架

功能特点&#xff08;Features&#xff09; 易维护代码&#xff08;Easy Asset Loading&#xff09; Phaser可以加载图片&#xff0c;音频文件&#xff0c;数据文件&#xff0c;文本文件和自动解析精灵图和纹理地图集数据&#xff08;出口纹理封隔器或Flash CS6&#xf…

8大排序算法图文讲解转

本文链接&#xff1a;http://www.cricode.com/3212.html 作者&#xff1a;快课网——Jay13 转载请务必保留作者出处&#xff0c;谢谢&#xff01; 排序算法可以分为内部排序和外部排序&#xff0c;内部排序是数据记录在内存中进行排序&#xff0c;而外部排序是因排序的数据很大…

Immutable Collections(3)Immutable List实现原理(中)变化中的不变

Immutable Collections(3)Immutable List实现原理(中)变化中的不变 文/玄魂 前言 在上一篇文章&#xff08;Immutable Collections&#xff08;2&#xff09;ImmutableList<T>实现原理.&#xff08;上&#xff09;&#xff09;,分析了&#xff09;ImmutableList<T>…

大话Fragment管理

大话Fragment管理 上一个项目遇到了一个Activity 管理30个Fragment的情况&#xff0c;刚开始的时候真的管理的焦头烂额&#xff0c;但是后来不停的研究api文档&#xff0c;渐渐的明白了android的Fragment管理 体系。下面用…

第一季4:Hi3518E_SDK_Vx.x.x.x的SDK目录结构

一、Hi3518E_SDK_V1.0.3.0.tgz的位置 “Hi3518E_SDK_V1.0.3.0.tgz”位于“Hi3518E V200R001C01SPC030”中&#xff0c;其目录包含关系如下。 Hi3518E_SDK_V1.0.3.0.tgz 解压后内部文件组织如下。 二、执行SDK展开脚本sdk.unpack后的目录关系 将Hi3518E_SDK_V1.0.3.0.tgz拷贝到…

第一季6:海思方案中uboot、kernel和rootfs的烧写方法

以下内容源于朱有鹏嵌入式课程的学习与整理&#xff0c;如有侵权请告知删除。 一、概述 因为所用的板子默认从SPI Flash启动&#xff0c;因此本文主要讲如何“使用tftp&#xff0c;烧写映像文件&#xff08;uboot、kernel、rootfs&#xff09;到SPI Flash”。另外海思还提供了“…

Java Web笔记之Struts2.1 +Hibernate3.3 +Spring3.0

2019独角兽企业重金招聘Python工程师标准>>> 1、Struts2 1.1、了解Struts2 Struts2是基于MVC设计模式的Java Web框架技术之一&#xff0c;按照MVC设计思想把Java Web应用程序分为&#xff1a; 控制器层&#xff0c;包括核心控制器FilterDispatcher和业务控制器Actio…

高地址和低地址、高字节与低字节、大小端模式的转换、存储顺序

以下内容源于网络资源的学习与整理&#xff0c;如有侵权请告知删除。 一、高地址和低地址 二、高字节低字节 如int a16777220&#xff0c;化为十六进制是0x01 00 00 04&#xff0c;则04属于低字节&#xff0c;01属于高字节。 三、大小端模式 &#xff08;1&#xff09;如果a在内…

漫谈数据挖掘从入门到进阶

入门&#xff1a;数据挖掘入门的书籍&#xff0c;中文的大体有这些&#xff1a;Jiawei Han的《数据挖掘概念与技术》Ian H. Witten / Eibe Frank的《数据挖掘 实用机器学习技术》Tom Mitchell的《机器学习》TOBY SEGARAN的《集体智慧编程》Anand Rajaraman的《大数据》Pang-Nin…

(转)Asp.Net生命周期系列一

原文地址&#xff1a;http://www.cnblogs.com/skm-blog/archive/2013/07/07/3176713.html Asp.Net生命周期对于初级甚至中级程序员来说&#xff0c;一直都是一个难题&#xff0c;很多程序员不了解生命周期&#xff0c;导致使用Asp.Net做开发感觉很不灵活&#xff0c;感觉太多东…

与TCP有关的面试内容

以下内容源于网络资料的学习与整理。 参考博客 TCP/IP四层模型 - BlueTzar - 博客园&#xff08;OSI参考模型和TCP模型的详解&#xff0c;包括格式&#xff09; TCP/IP协议-为什么说TCP是可靠连接_shuaixio的博客-CSDN博客&#xff08;为什么可靠及优缺点&#xff09; 两张动图…

JUnit4概述

JUnit4是JUnit框架有史以来的最大改进&#xff0c;其主要目标便是利用Java5的Annotation特性简化测试用例的编写。先简单解释一下什么是Annotation&#xff0c;这个单词一般是翻译成元数据。元数据是什么&#xff1f;元数据就是描述数据的数据。也就是说&#xff0c;这个东西在…

正则表达式30分钟入门教程(转)

分享到一键分享QQ空间新浪微博百度云收藏人人网腾讯微博百度相册开心网腾讯朋友百度贴吧豆瓣网搜狐微博百度新首页QQ好友和讯微博更多...百度分享首页 | 正则表达式30分钟入门教程 | 常用正则表达式| 正则表达式速查表 | 正则表达式测试工具 | 正则表达式 | 正则练习器在线版 正…