SQLite 嵌入式数据库

目录:

一、SQLite 简介

  • 轻量化,易用的嵌入式数据库,用于设备端的数据管理,可以理解成单点的数据库。传统服务器型数据库用于管理多端设备,更加复杂
  • SQLite是一个无服务器的数据库,是自包含的。这也称为嵌入式数据库,这意味着数据库引擎作为应用程序的一部分运行
  • MySQL需要运行服务器,MySQL将需要客户端和服务器架构通过网络进行交互
SQLite的优点 SQLite的缺点 MySQL的优点 MySQL的缺点
基于文件,易于设置和使用 适合基础开发和测试 轻松携带 使用标准SQL语法进行微小更改 使用方便 缺乏用户管理和安全功能 不容易扩展 不适合大数据库 无法定制 使用方便 提供了许多与数据库相关的功能 良好的安全功能 易于扩展,适用于大型数据库 提供良好的速度和性能 提供良好的用户管理和多种访问控制 需要一些技术专业知识来设置 与传统SQL相比,语法略有不同
  • 基于嵌入式的数据库主要有:SQLiteFirebirdBerkeley DBeXtremeDB
  • Firebird是关系型数据库,功能强大,支持存储过程,SQL兼容等
  • SQLite关系型数据库,体积小,支持ACID事务
  • Berkeley DB并没有数据库服务器的概念,他的程序直接链接到应用程序中
  • eXtremeDB是内存数据库,运行效率高

二、SQLite 数据库安装

1、安装方式一:

bash 复制代码
sudo apt-get -y install sqlite

安装的可能不是最新版本

2、安装方式二:

通过 SQLite 官方网址(https://www.sqlite.org/download.html)下载安装包

下载Source Codesqlite-autoconf.tar.gz

将压缩包上传到开发板上,解压并安装:

bash 复制代码
tar xvf sqlite-autoconf-3460000.tar.gz

cd sqlite-autoconf-3460000

// 配置安装路径在/usr/local
./configure --prefix=/usr/local

// 编译
make

// 安装
sudo make install

三、SQLite 的命令用法

1、创建、打开、退出数据库:

sql 复制代码
// 进入数据库指令交互页面
sqlite3

// 退出数据库
.quit

// 打开数据库 test.db(没有该数据库则创建该数据库)
.open test.db

// 创建并打开数据库 test.db(该指令直接在终端命令窗口运行)
qulite3 test.db

// 查看当前打开的数据库
.database

// 敲错指令进入 ...> 状态,通过 ctrl + z 退出
...>

2、编辑数据库:

sql 复制代码
// 创建一张表格,字段分别为:整型 id,字符型 name,整型 score
create table stu(id Integer,name char,score Integer);

// 列出数据库的所有表格
.tables

// 在 stu 表格插入一条数据,在 values() 编辑要插入内容
insert into stu values(001,'lcx',99);

// 在 stu 表格插入一条数据,只有 name 和 score 字段内容
insert into stu(name,score) values('licx',100);

// 查询 stu 表格的所有字段数据
select * from stu;

// 只查询 stu 表格中 name 和 score 字段的内容
select name,score from stu;

// 删除 stu 表格中 id = 1 的所有数据
delete from stu where id = 1;

// 删除 stu 表格
drop table stu;

// 更改表格 stu 的数据,将 id = 1 的所有数据的 name 改为 'li'
update stu set name = 'li' where id = 1;

// 增加 stu 表格一列数据分类:字符型 sex
alter table stu add column sex char;

四、SQLite 的编程操作

  • 编译:
    由于我的SQLite3安装在/usr/local/目录下,而相应的库在/usr/local/lib/目录下:

    编译时应该链接库:-lsqlite3

1、打开 / 创建数据库的 C 接口:

打开一个指向 SQLite 数据库文件的连接:

c 复制代码
#include <sqlite3.h>

int sqlite3_open(const char *filename, sqlite3 **ppDb);
返回值: 成功返回 0,失败返回非 0 错误代码
filename参数: 需要打开的SQLite数据库的文件名
ppDb参数: 返回一个用于其他SQLite程序的数据库连接对象

关闭之前调用 sqlite3_open() 打开的数据库连接:

c 复制代码
#include <sqlite3.h>

int sqlite3_close(sqlite3 *ppDb);
返回值: 成功返回 0,失败返回错误代码 如果还有查询没有完成,sqlite3_close()将返回SQLITE_BUSY禁止关闭的错误消息

错误信息:

c 复制代码
#include <sqlite3.h>

const char *sqlite3_errmsg(sqlite3 *db);
// 通过出错的句柄返回错误信息,获取最近调用的 API 接口返回的错误信息

int sqlite3_errcode(sqlite3 *db);
// 通过出错句柄返回错误码,通常用来获取最近调用的 API 接口返回的错误代码

打开关闭数据库例程:

c 复制代码
#include <stdio.h>
#include <sqlite3.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    sqlite3 *db;
    char *zErrMsg = 0;
    int rc;

    if(argc < 2){
        printf("Usage: %s xxx.db\n", argv[0]);
        return -1;
    }

    rc = sqlite3_open(argv[1], &db);
    if(rc){
        printf("Can't open database: %s\n", sqlite3_errmsg(db));
        printf("Error code: %d\n", sqlite3_errcode(db));
        return -1;
    }else{
        printf("Opened database successfully\n");
    }

    sqlite3_close(db);

    return 0;
}

2、操作表的 C 接口:

操作数据库的函数:

c 复制代码
#include <sqlite3.h>

sqlite3_exec(sqlite3 *db, const char *sql, sqlite_callback, void *data, char **errmsg);

// 回调函数
typedef int (*sqlite3_callback)(void*,int,char**, char**);
返回值: 成功返回 0,失败返回错误代码
db参数: 数据库的句柄
sql参数: 执行SQL命令的语句,参考 三、SQLite 的命令用法
sqlite_callback类型函数参数: 回调函数: int callback(void *arg, int column_size, char *column_value[], char *column_name[]); arg参数:         执行sqlite3_exec()时由sqlite3_exec()传递给回调函数sqlite3_exec()data参数值 column_size参数:    执行sqlite3_exec()时由sqlite3_exec()传递给回调函数数据库的字段数 column_value参数:  执行sqlite3_exec()时由sqlite3_exec()传递给回调函数数据库列的值 column_name参数:    执行sqlite3_exec()时由sqlite3_exec()传递给回调函数字段名
data参数: 传递给回调函数的参数地址
errmsg参数: 返回的错误信息

例程:打印数据库中 stu 表的数据:

c 复制代码
#include <stdio.h>
#include <sqlite3.h>

int callback(void *arg, int column_size, char *column_value[], char *column_name[])
{
    int i;
    printf("arg = %s\n",(char *)arg);
    
    for(i=0;i<column_size;i++){
        printf("%s = %s\n", column_name[i], column_value[i]);
    }
	
	printf("--------------------\n");
    return 0;		// 这里必须返回 0,这样数据库中有多少条数据,这个回调函数就会被调用多少次
}

int main(char argc, char **argv)
{
    sqlite3 *db;
    int ret;
	char *errMsg = NULL;

    if(argc < 2){
        printf("Usage: %s xxx.db\n",argv[0]);
        return -1;
    }
    if( (ret = sqlite3_open(argv[1],&db)) == SQLITE_OK){
        printf("open %s success\n",argv[1]);
    }else{
        printf("error:%s,%d\n",sqlite3_errmsg(db),ret);
        if(ret == 14){
            printf("permission den\n");
        }
        return -1;
    }

    sqlite3_exec(db, "select * from stu;", callback, "content of sql:", &errMsg);
    // 注意我们的 errMsg 初始化时为 NULL 空指针,理由是 sqlite_exec() 运行时会为该指针分配内存空间

    sqlite3_close(db);
    printf("done\n");
    return 0;
}

现有如图所示表:

运行结果:

创建表操作(关键代码):

c 复制代码
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;
}

......	......	......	......	......	......

	ret = sqlite3_exec(db, "create table stu(id Integer,name char);", \
						callback, NULL, &errMsg);

	if( ret != SQLITE_OK ){
		fprintf(stderr, "SQL error: %s\n", errMsg);
		sqlite3_free(errMsg);
	}else{
		fprintf(stdout, "Table created successfully\n");
	}

向表中插入数据(关键代码)

c 复制代码
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;
}

......	......	......	......	......	......

	rc = sqlite3_exec(db, "insert into stu values(003, 'li');", callback, NULL, &errMsg);
	if( rc != SQLITE_OK ){
		fprintf(stderr, "SQL error: %s\n", errMsg);
		sqlite3_free(errMsg);
	}else{
	fprintf(stdout, "Records created successfully\n");
}

关于表数据的增删改查代码大同小异,这里不作过多赘述...

相关推荐
Rookie也要加油26 分钟前
01_SQLite
数据库·sqlite
liuxin3344556631 分钟前
教育技术革新:SpringBoot在线教育系统开发
数据库·spring boot·后端
看山还是山,看水还是。1 小时前
MySQL 管理
数据库·笔记·mysql·adb
fishmemory7sec1 小时前
Koa2项目实战2(路由管理、项目结构优化)
数据库·mongodb·koa
momo小菜pa1 小时前
【MySQL 09】表的内外连接
数据库·mysql
Jasonakeke2 小时前
【重学 MySQL】四十九、阿里 MySQL 命名规范及 MySQL8 DDL 的原子化
数据库·mysql
程序猿小D2 小时前
第二百六十九节 JPA教程 - JPA查询OrderBy两个属性示例
java·开发语言·数据库·windows·jpa
小宇成长录2 小时前
Mysql:数据库和表增删查改基本语句
数据库·mysql·数据库备份
团儿.3 小时前
解锁MySQL高可用新境界:深入探索MHA架构的无限魅力与实战部署
数据库·mysql·架构·mysql之mha架构
程序猿小D3 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa