嵌入式数据库--sqlite

目录

数据库的基本概念和常用数据库

sqlite介绍

sqlite安装步骤

sqlite常用命令

sqlite3的C语言的API函数详解

sqlite3使用项目案例


数据库的基本概念和常用数据库

数据库的基本概念:

  1. 数据库(Database):是一个按照规定格式存储数据的仓库。
  2. 数据库管理系统(Database Management System,DBMS):是一种允许用户定义、创建、维护和控制访问数据库的软件系统。
  3. 数据表(Table):是由行和列组成的二维表格,是数据库中的基本存储单元。
  4. 字段(Field):表中列的属性,表示一个数据的特定部分。
  5. 记录(Record):表中的一行数据。
  6. 主键(Primary Key):表中唯一标识每个记录的字段。
  7. 外键(Foreign Key):用于建立两个或多个表之间的关系。
  8. 索引(Index):用于加快数据的检索速度,类似于书的目录。

常用的数据库:

  1. MySQL:是一款免费开源的关系型数据库管理系统,被广泛应用于互联网应用领域。
  2. Oracle:是一款商业关系型数据库管理系统,具有高性能、高可靠和高安全性等优点。
  3. SQL Server:是微软公司开发的关系型数据库管理系统,适用于大型企业应用。
  4. MongoDB:是一款基于文档的NoSQL数据库,具有高可扩展性和灵活性。
  5. PostgreSQL:是一款开源的关系型数据库管理系统,具有高度的可扩展性和安全性。
  6. sqilte:是一个轻型的数据库系统,它不需要一个单独的服务器进程或操作系统,也不需要配置和管理等繁琐的工作,非常适用嵌入式开发。

sqlite介绍

SQLite 是一个轻型的数据库系统,它不需要一个单独的服务器进程或操作系统,也不需要配置和管理等繁琐的工作。SQLite 主要包括以下几个概念:

  1. 数据库文件:SQLite 基于文件的方式进行存储,每个数据库对应一个文件,文件以 .db 为后缀名。数据库文件中包含了一个或多个表,表包含了多个数据行。

  2. 表:表是 SQLite 中的基本数据存储单位。一个表由多个字段组成,每个字段对应表中一列数据。

  3. 字段:表中的每个列称为一个字段,字段包含了数据的类型、长度等信息。

  4. 数据行:表中的每一行称为一个数据行,每个数据行包含了对应字段的数据。

  5. 主键:每个表都必须有一个主键,用来唯一标识表中的每行数据。主键可以是一个或多个字段的组合。在 SQLite 中,每个表可以自动创建一个名为 “rowid” 的隐藏字段作为主键。

  6. SQL:SQL(Structured Query Language)是一种用于管理关系型数据库的语言。SQLite 也支持 SQL,可以使用 SQL 对数据库进行查询、插入、更新、删除等操作。

sqlite安装步骤

以下是在Ubuntu上安装SQLite的步骤:

  1. 打开终端窗口。

  2. 通过以下命令更新Ubuntu软件包列表:

    sudo apt-get update
    
  3. 安装SQLite软件包:

    sudo apt-get install sqlite3
    
  4. 等待安装完成。

  5. 检查SQLite是否成功安装:

    sqlite3 --version
    

    如果SQLite版本号被显示出来,说明SQLite已经成功安装。

安装可视化工具

sudo apt-get install sqlitebrowser

sqlite常用命令

下面是SQLite常用的系统命令:

  1. .help:查询SQLite帮助信息。

  2. .tables:列出当前数据库中的所有表。

  3. .schema:列出指定表的架构。

  4. .header on|off:打开或关闭输出的列头。

  5. .mode MODE:设置输出模式,如:linecolumnlist

  6. .show:显示当前的设置参数。

  7. .quit:退出SQLite命令行界面。

  8. .backup FILENAME:备份数据库,将当前数据库备份到指定文件中。

  9. .restore FILENAME:恢复备份的数据库。

  10. .dump:将整个数据库导出为SQL脚本。

  11. .timeout MS:设置命令的超时时间。

  12. .echo on|off:打开或关闭命令行输出。

  13. .explain on|off:打开或关闭查询计划的输出。

  14. .separator STRING:设置输出分隔符。

  15. .import FILE TABLE:将指定文件中的数据导入到指定表中。

  16. .exit      退出.

注意:命令前面需要加一个英文的.,表示这是一个系统命令。

下面是sqlite常用的sql语句:

  1. 创建表:CREATE TABLE table_name (column1 datatype, column2 datatype, column3 datatype, ...);

  2. 插入数据:INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);

  3. 修改数据:UPDATE table_name SET column1 = value1, column2 = value2, ... WHERE condition;

  4. 删除数据:DELETE FROM table_name WHERE condition;

  5. 查询数据:SELECT column1, column2, ... FROM table_name WHERE condition;

  6. 聚合函数:SELECT COUNT(column_name), AVG(column_name), SUM(column_name), MAX(column_name), MIN(column_name) FROM table_name;

  7. 排序:SELECT column1, column2, ... FROM table_name ORDER BY column_name [ASC|DESC];

  8. 分组:SELECT column1, column2, ... FROM table_name GROUP BY column_name;

  9. 连接查询:SELECT column1, column2, ... FROM table_name1 INNER/LEFT/RIGHT JOIN table_name2 ON table_name1.column_name = table_name2.column_name;

  10. 子查询: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");
	}
}
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值