嵌入式数据库--sqlite
目录
数据库的基本概念和常用数据库
sqlite介绍
sqlite安装步骤
sqlite常用命令
sqlite3的C语言的API函数详解
sqlite3使用项目案例
数据库的基本概念和常用数据库
数据库的基本概念:
- 数据库(Database):是一个按照规定格式存储数据的仓库。
- 数据库管理系统(Database Management System,DBMS):是一种允许用户定义、创建、维护和控制访问数据库的软件系统。
- 数据表(Table):是由行和列组成的二维表格,是数据库中的基本存储单元。
- 字段(Field):表中列的属性,表示一个数据的特定部分。
- 记录(Record):表中的一行数据。
- 主键(Primary Key):表中唯一标识每个记录的字段。
- 外键(Foreign Key):用于建立两个或多个表之间的关系。
- 索引(Index):用于加快数据的检索速度,类似于书的目录。
常用的数据库:
- MySQL:是一款免费开源的关系型数据库管理系统,被广泛应用于互联网应用领域。
- Oracle:是一款商业关系型数据库管理系统,具有高性能、高可靠和高安全性等优点。
- SQL Server:是微软公司开发的关系型数据库管理系统,适用于大型企业应用。
- MongoDB:是一款基于文档的NoSQL数据库,具有高可扩展性和灵活性。
- PostgreSQL:是一款开源的关系型数据库管理系统,具有高度的可扩展性和安全性。
- sqilte:是一个轻型的数据库系统,它不需要一个单独的服务器进程或操作系统,也不需要配置和管理等繁琐的工作,非常适用嵌入式开发。
sqlite介绍
SQLite 是一个轻型的数据库系统,它不需要一个单独的服务器进程或操作系统,也不需要配置和管理等繁琐的工作。SQLite 主要包括以下几个概念:
数据库文件:SQLite 基于文件的方式进行存储,每个数据库对应一个文件,文件以 .db 为后缀名。数据库文件中包含了一个或多个表,表包含了多个数据行。
表:表是 SQLite 中的基本数据存储单位。一个表由多个字段组成,每个字段对应表中一列数据。
字段:表中的每个列称为一个字段,字段包含了数据的类型、长度等信息。
数据行:表中的每一行称为一个数据行,每个数据行包含了对应字段的数据。
主键:每个表都必须有一个主键,用来唯一标识表中的每行数据。主键可以是一个或多个字段的组合。在 SQLite 中,每个表可以自动创建一个名为 “rowid” 的隐藏字段作为主键。
SQL:SQL(Structured Query Language)是一种用于管理关系型数据库的语言。SQLite 也支持 SQL,可以使用 SQL 对数据库进行查询、插入、更新、删除等操作。
sqlite安装步骤
以下是在Ubuntu上安装SQLite的步骤:
打开终端窗口。
通过以下命令更新Ubuntu软件包列表:
sudo apt-get update
安装SQLite软件包:
sudo apt-get install sqlite3
等待安装完成。
检查SQLite是否成功安装:
sqlite3 --version
如果SQLite版本号被显示出来,说明SQLite已经成功安装。
安装可视化工具
sudo apt-get install sqlitebrowser
sqlite常用命令
下面是SQLite常用的系统命令:
.help
:查询SQLite帮助信息。.tables
:列出当前数据库中的所有表。.schema
:列出指定表的架构。.header on|off
:打开或关闭输出的列头。.mode MODE
:设置输出模式,如:line
、column
、list
。.show
:显示当前的设置参数。.quit
:退出SQLite命令行界面。.backup FILENAME
:备份数据库,将当前数据库备份到指定文件中。.restore FILENAME
:恢复备份的数据库。.dump
:将整个数据库导出为SQL脚本。.timeout MS
:设置命令的超时时间。.echo on|off
:打开或关闭命令行输出。.explain on|off
:打开或关闭查询计划的输出。.separator STRING
:设置输出分隔符。.import FILE TABLE
:将指定文件中的数据导入到指定表中。.exit 退出.
注意:命令前面需要加一个英文的.
,表示这是一个系统命令。
下面是sqlite常用的sql语句:
创建表:CREATE TABLE table_name (column1 datatype, column2 datatype, column3 datatype, ...);
插入数据:INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
修改数据:UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;
删除数据:DELETE FROM table_name WHERE condition;
查询数据:SELECT column1, column2, ... FROM table_name WHERE condition;
聚合函数:SELECT COUNT(column_name), AVG(column_name), SUM(column_name), MAX(column_name), MIN(column_name) FROM table_name;
排序:SELECT column1, column2, ... FROM table_name ORDER BY column_name [ASC|DESC];
分组:SELECT column1, column2, ... FROM table_name GROUP BY column_name;
连接查询:SELECT column1, column2, ... FROM table_name1 INNER/LEFT/RIGHT JOIN table_name2 ON table_name1.column_name = table_name2.column_name;
子查询:SELECT column1, column2, ... FROM table_name WHERE column_name IN (SELECT column_name FROM table_name WHERE condition);
sqlite3的C语言的API函数详解
SQLite是一个轻量级的嵌入式数据库,它的API函数非常简单易用,以下是它的C语言API函数详解和参数定义:
1.sqlite3_open - 打开一个数据库
函数原型:int sqlite3_open(const char *filename, sqlite3 **ppDb);
参数说明:
- filename:要打开的数据库文件名。
- ppDb:指向sqlite3 *类型的指针的指针,用于存储打开的数据库的句柄。
返回值:
- 成功返回SQLITE_OK,否则返回其他错误码。
2.sqlite3_close - 关闭一个数据库
函数原型:int sqlite3_close(sqlite3 *db);
参数说明:
- db:要关闭的数据库句柄。
返回值:
- 成功返回SQLITE_OK,否则返回其他错误码。
3.sqlite3_exec是一个SQLite C API中的函数,它可以执行一个或多个SQL语句并返回结果,使用简单方便。
函数原型:
int sqlite3_exec(sqlite3*, /* An open database */const char *sql, /* SQL to be executed */int (*callback)(void*,int,char**,char**), /* Callback function */void *, /* 1st argument to callback */char **errmsg /* Error msg written here */
);
参数列表:
- sqlite3 *db:已打开的SQLite数据库句柄;
- const char *sql:要执行的SQL语句;
- int (callback)(void,int,char**,char**):回调函数指针(可选参数);
- void *:回调函数的第一个参数(可选参数);
- char **errmsg:如果出现错误,错误信息将被记录在这个指针指向的变量中。
返回值:
- 如果执行成功,则返回 SQLITE_OK;
- 如果执行出错,则返回错误代码,返回码的列表可以在文档中查找。
使用方法:
下面是一个使用sqlite3_exec函数执行SELECT语句的示例:
#include <stdio.h>
#include <sqlite3.h>int main(int argc, char** argv)
{sqlite3* db;char* sql;char* errmsg;int ret;sqlite3_stmt* stmt;const char* tail;const unsigned char* val;// 打开数据库ret = sqlite3_open("test.db", &db);if (ret != SQLITE_OK){printf("open database fail:%s\n", sqlite3_errmsg(db));sqlite3_close(db);return -1;}// 执行查询语句,返回结果集sql = "SELECT * FROM t_user";ret = sqlite3_exec(db, sql, NULL, NULL, &errmsg);if (ret != SQLITE_OK){printf("exec sql fail: %s\n", errmsg);sqlite3_free(errmsg);sqlite3_close(db);return -1;}// 取出查询结果集的值并输出while (sqlite3_step(stmt) == SQLITE_ROW){val = sqlite3_column_text(stmt, 0);printf("%s\n", val);}// 释放资源sqlite3_finalize(stmt);sqlite3_close(db);return 0;
}
#include <sqlite3.h>
#include <iostream>int callback(void* data, int argc, char** argv, char** azColName) {std::cout << "Callback function called." << std::endl;for(int i = 0; i < argc; i++) {std::cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << std::endl;}return 0;
}int main() {sqlite3* db;char* zErrMsg = 0;int rc;rc = sqlite3_open("test.db", &db);if(rc) {std::cout << "Can't open database: " << sqlite3_errmsg(db) << std::endl;return(0);} else {std::cout << "Database opened successfully." << std::endl;}const char* sql = "CREATE TABLE COMPANY(""ID INT PRIMARY KEY NOT NULL,""NAME TEXT NOT NULL,""AGE INT NOT NULL);";rc = sqlite3_exec(db, sql, callback, 0, &zErrMsg);if(rc != SQLITE_OK) {std::cout << "SQL error: " << zErrMsg << std::endl;sqlite3_free(zErrMsg);} else {std::cout << "Table created successfully." << std::endl;}sqlite3_close(db);return 0;
}
回调函数详解:
int (*callback)(void*, int, char**, char**);
其中,第一个参数是一个指针,通常用于传递应用程序自定义的数据;第二个参数是结果集中当前行的列数;第三个参数是当前行的值;第四个参数是当前行的列名。回调函数的返回值是整数类型,如果返回非0值,那么sqlite3_exec将停止执行后续的SQL语句。
sqlite3使用项目案例
假如我家开了个水果超市,有以下水果,想实现自动化管理,扫描二维码就能知道当前的水果状态,进货几天了,好久需要再次进货,那些水果畅销,那些水果不畅销,那些水果春夏秋冬的价格波动,好,那么现在我想将这些信息保存在数据库中
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <sqlite3.h>
#include <stdlib.h>#define DATABASE "fruit.db"void do_stock(sqlite3 *);
void do_sell(sqlite3 *);
void do_select_in(sqlite3 *);
void do_select_avg(sqlite3 *);
void do_select_stock_list(sqlite3 *);
void do_select_sell_list(sqlite3 *);int main(int argc, const char *argv[])
{sqlite3 *db;int ret;char *msgerr;if (sqlite3_open(DATABASE, &db) != SQLITE_OK){printf("open database failed %s\n", sqlite3_errmsg(db));exit(0);}else{printf("open database success\n");}// 创建进货表和卖出表和库存表if(sqlite3_exec(db, "create table if not exists fruit_stock(id integer primary key autoincrement, name char, price float, number int, time char);", NULL, NULL, &msgerr) != SQLITE_OK ){printf("%s", msgerr);exit(0);}if(sqlite3_exec(db, "create table if not exists fruit_sell(id integer primary key autoincrement, name char, price float, number int, time char);", NULL, NULL, &msgerr) != SQLITE_OK ){printf("%s", msgerr);exit(0);}if(sqlite3_exec(db, "create table if not exists fruit_in(id integer primary key autoincrement, name char, number int);", NULL, NULL, &msgerr) != SQLITE_OK ){printf("%s", msgerr);exit(0);}// while(1){printf("*****************************************************************************************\n");printf("1:fruit_stock 2:fruit_sell 3:select_in 4:select_frult_avg 5:stock_list 6:sell_list 7:exit\n");printf("*****************************************************************************************\n");printf("please select:");scanf("%d", &ret);getchar();switch(ret){case 1://进货do_stock(db);break;case 2://出货do_sell(db);break;case 3:// 查询库存do_select_in(db);break;case 4:// 查询卖出水果平均价格do_select_avg(db);break;case 5:// 查询出货记录do_select_stock_list(db);break;case 6:// 查询入库记录do_select_sell_list(db);break;case 7:// 退出sqlite3_close(db);exit(0);}}return 0;
}void do_stock(sqlite3 * db){char sql[512];char name[32];float price;int number;char ntime[64];time_t now;struct tm *st;char *msgerr;printf("input fruit stock name:");scanf("%s", name);getchar();printf("input fruit stock price:");scanf("%f", &price);getchar();printf("input fruit stock number:");scanf("%d", &number);getchar();now = time(NULL);st = localtime(&now);strftime(ntime, 64, "%Y-%m-%d %H:%M:%S", st);sprintf(sql, "insert into fruit_stock(name, price, number, time) values( '%s', %f ,%d, '%s');", name, price, number, ntime);if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("stock done success\n");}memset(sql, 0, 512);sprintf(sql, "update fruit_in set number=(select number from fruit_in where name='%s') + %d where name='%s';", name, number, name);//printf("sql ==== %s\n", sql);if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("update fruit_in success\n");}return ;
}void do_sell(sqlite3 * db){char sql[512];char name[32];float price;int number;char ntime[64];time_t now;struct tm *st;char *msgerr;printf("input fruit stock name:");scanf("%s", name);printf("input fruit stock price:");scanf("%f", &price);printf("input fruit stock number:");scanf("%d", &number);st = localtime(&now);strftime(ntime, 64, "%Y-%m-%d %H:%M:%S", st);sprintf(sql, "insert into fruit_sell(name, price, number, time) values( '%s', %f ,%d, '%s');", name, price, number, ntime);//printf("sql ==== %s\n", sql);if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("stock done success\n");}memset(sql, 0, 512);sprintf(sql, "update fruit_in set number=(select number from fruit_in where name='%s') - %d where name='%s';", name, number, name);//printf("sql ==== %s\n", sql);if (sqlite3_exec(db, sql, NULL, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("update fruit_in success\n");}return ;
}int callback(void *arg, int f_num, char **f_val, char **f_name){int i;for (i=0; i < f_num; i++){printf("%-8s", f_val[i]);}printf("\n");return 0;
}void do_select_in(sqlite3 *db){char sql[512];char *msgerr;sprintf(sql, "select name ,number from fruit_in;");printf("name number\n");if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("select fruit_in success\n");}
}void do_select_avg(sqlite3 *db){char sql[512];char *msgerr;sprintf(sql, "select name, avg(price) from fruit_sell group by name;");printf("%s\n",sql);if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("select fruit_sell success\n");}
}void do_select_stock_list(sqlite3 *db){char sql[512];char *msgerr;sprintf(sql, "select name, price, time from fruit_stock;");printf("%s\n",sql);if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("select fruit_stock success\n");}
}void do_select_sell_list(sqlite3 *db){char sql[512];char *msgerr;sprintf(sql, "select name, price, time from fruit_sell;");printf("%s\n",sql);if (sqlite3_exec(db, sql, callback, NULL, &msgerr) != SQLITE_OK)printf("%s\n", msgerr);else{printf("select fruit_in is avg success\n");}
}
嵌入式数据库--sqlite相关推荐
- 嵌入式数据库SQLite的编译、安装和使用[ZT]
嵌入式数据库SQLite的编译.安装和使用 下文介绍的内容都是基于 RedHat Linux 9.0 平台的. 引言:sqlite简介 sqlite是嵌入式SQL数据库引擎SQLite(SQLite ...
- 【嵌入式实验】《嵌入式数据库 sqlite 移植及使用》
嵌入式数据库 sqlite 移植及使用 一.实验目的 二.实验内容 三.预备知识 四.实验设备及工具(包括软件调试工具) 五.实验步骤 实验一:移植嵌入式数据库 sqlite 1~5:安装 sqlit ...
- 嵌入式数据库Sqlite移植教程-转
嵌入式数据库Sqlite移植教程 sqlite-3.3.6编译安装与交叉编译全过程详细记录 本文介绍的内容都是基于 Linux RedHat 9.0 平台的. 一.PC机编译安装 请阅读在安装包里的 ...
- android 内嵌 数据库,安卓开发之嵌入式数据库sqlite的操作方法
安卓App开发经常会需要嵌入式数据库sqlite的辅助,它可以存放我们必要的应用数据,下面介绍下如何使用java连接读取sqlite中的数据. 本文中的代码经本人测试可用,可以参考. 代码如下: DB ...
- 南京邮电大学嵌入式系统开发实验3:嵌入式数据库sqlite移植及使用
实验3 嵌入式数据库sqlite移植及使用 一.实验目的 理解嵌入式软件移植的基本方法,掌握sqlite数据库软件移植的步骤,掌握sqlite开发的两种方式-命令模式和C代码开发模式的使用方法,并编 ...
- Sqlite 移动嵌入式数据库Sqlite的日常SQL操作语句汇总
序言: 嵌入式数据库Sqlite的基本sql使用汇总,使用测试起来,与关系型数据库mysql在语法上有很多的相似之处,先准备测试数据: CREATE TABLE COMPANY(ID INT ...
- Linux网络编程小项目sqlite,嵌入式数据库sqlite
*************************************** * 嵌入式数据库sqlite在LPC22XX上的应用 * ******************************* ...
- 嵌入式数据库SQLite与Java
嵌入式数据库SQLite与Java SQLite作为一个开源的嵌入式数据库产品,具有系统开销小,检索效率高的特性,适用于手机.PDA.机顶盒设备等电器,并且作为嵌入式数据库在可下载的消费类应用程序中运 ...
- Java与嵌入式数据库SQLite的结合
为什么80%的码农都做不了架构师?>>> 最近研究了一下嵌入式数据库,并使用Java与一个叫做SQLite的轻量级数据库结合写了个小程序,这个过程中也获得了不少经验,下面来总结 ...
- 嵌入式数据库 SQLite 浅析
SQLite是一个非常轻量级自包含(lightweight and self-contained)的DBMS,它可移植性好,很容易使用,很小,高效而且可靠.SQLite嵌入到使用它的应用程序中,它们共 ...
最新文章
- 如何避免云整合的问题
- asp.net 微信企业号办公系统-流程设计--保存与发布
- 微软开源的Trill是什么?
- 21个深度学习调参的实用技巧
- 英特尔的务实创新之路:实在做技术,赋能开发者 | InfoQ推荐
- SpringCloud 基于OAth2.0 搭建认证授权中心_02
- oracle数据库常用操作语句
- 成都大数据等新经济代表行业在全国城市位居前列
- 教你一招解决#65279导致页面莫名其妙空行
- .Net中数据绑定控件应用小技巧
- android状态栏自定义,如何自定义Android状态栏颜色
- C#建立手机号段全库
- 生成条码 -- jsbarcode
- leetcode刷题(第739题)——每日温度
- 量子计算深化:大规模量子计算(相关论文108篇推荐)
- 爱因斯坦五五问题(zebra问题)斑马问题
- vii php,VIIShop php网上商店系统
- 华大单片机HC32F005串口烧录程序
- Java 编程中,有哪些好的习惯应该从一开始就值得坚持?
- gis利器之Gdal(一)