SQLite3使用笔记(1)——查询
1. 概述
SQLite是一个嵌入式SQL数据库引擎。与大多数其他 SQL 数据库不同,SQLite 没有单独的服务器进程。SQLite 直接读写普通磁盘文件。具有多个表、索引、触发器和视图的完整SQL数据库包含在单个磁盘文件中。
SQLite比MySQL还要轻量级,官方提供的程序包大约1MB。但是这么小的内容居然也是一个关系型数据库,所以SQLite也很适合作为入门数据库。其中,SQL最基础的功能就是查询了。
2. 详论
2.1. 打开/关闭数据库
使用数据库的第一步当然是打开数据库了。对于C接口来说,通常的实现是提供一个打开的接口,得到一个句柄或者指针,然后通过这个句柄或者指针进行进一步操作,包括关闭数据库操作。SQLite正是这么设计的:
int nRes = sqlite3_open("D:/test.db", &pDB);
if (nRes != SQLITE_OK) {
cout << "Open database fail: " << sqlite3_errmsg(pDB);
return 1;
}
sqlite3_close(pDB);
通过sqlite3_open()这个函数打开数据库文件,如果数据库.db文件不存在,则会创建这个文件文件。一旦创建成功,在程序结束时最好调用sqlite3_close()这个函数进行关闭,否则会内存泄漏。如果需要更加精细的打开数据库文件控制,最好使用sqlite3_open_v2()这个接口:
int flags =
SQLITE_OPEN_READWRITE | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_SHAREDCACHE;
int nRes = sqlite3_open_v2("D:/test.db", &pDB, flags, nullptr);
sqlite3_open_v2()提供了很多打开数据库文件时的配置,例如如果需要在数据库文件不存在时进行创建,可以再加上SQLITE_OPEN_CREATE。
2.2. 数据查询
如果在可视化管理工具(例如SQLite Expert)中,无论是查询、插入、修改或者删除操作,都是直接输入SQL语句,然后执行运行操作,就可以得到相应的结果。SQLite也有这样的接口sqlite3_exec(),例如我们查询一个表中所有的数据:
char* cErrMsg;
int res =
sqlite3_exec(pDB, "select * from metadata;", ResultCallBack, 0, &cErrMsg);
if (res != SQLITE_OK) {
cout << "select fail: " << cErrMsg << endl;
return false;
}
sqlite3_free(cErrMsg);
sqlite3_exec()是一个回调函数,每查询到一行数据就调用一次:
int ResultCallBack(void* NotUsed, int argc, char** argv,
char** azColName) {
for (int i = 0; i < argc; i++) {
cout << azColName[i] << " = " << (argv[i] ? argv[i] : "NULL") << ", ";
}
cout << endl;
return 0;
}
如果需要进行更加细粒度的控制,那么一个合适的做法是使用statement(语句)。首先,我们将我们需要的sql语句编译成数据库引擎识别的字节码,这个步骤可以叫做prepare(准备):
sqlite3_stmt* statement = nullptr;
int ret = sqlite3_prepare_v2(pDB, sqlStr, -1, &statement, nullptr);
if (ret != SQLITE_OK) {
printf("prepare error ret : %d\n", ret);
return 1;
}
接着,就是执行准备好的SQL语句:
while (sqlite3_step(statement) == SQLITE_ROW) {
//...
}
sqlite3_setp()每次查询一行记录,并且返回SQLITE_ROW;知道查询完成,就返回SQLIET_DONE。通过这种方式实现了一种类似迭代器的操作,循环遍历每个查询结果。
最后,我们对每一行查询的结果进行解析:
while (sqlite3_step(statement) == SQLITE_ROW) {
cout << sqlite3_data_count(statement) << '\n';
cout << sqlite3_column_text(statement, 0) << '\t'
<< sqlite3_column_text(statement, 1) << '\n';
}
sqlite3_column_X是一系列函数,可以直接获取每一行相应列的数据类型。例如获取整型就是sqlite3_column_int。
另外,不要忘了关闭这个语句:
sqlite3_finalize(statement);
3. 参考
SQLite3使用笔记(1)——查询的更多相关文章
- mybatis学习笔记(14)-查询缓存之中的一个级缓存
mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...
- Linux学习笔记(七) 查询系统
1.查看命令 (1)man 可以使用 man 命令名称 命令查看某个命令的详细用法,其显示的内容如下: NAME:命令名称 SYNOPSIS:语法 DESCRIPTION:说明 OPTIONS:选项 ...
- SQLite3源程序分析之查询处理及优化
前言 查询处理及优化是关系数据库得以流行的根本原因,也是关系数据库系统最核心的技术之一.SQLite的查询处理模块很精致,而且很容易移植到不支持SQL的存储引擎(Berkeley DB最新的版本已经将 ...
- SQLite3 学习笔记
1.数据存储方式 Plist(NSArray\NSDictionary) Preference(偏好设置\NSUserDefaults) NSCoding(NSKeyedArchiver\NSkeye ...
- Python sqlite3操作笔记
创建数据库 def create_tables(dbname): conn = sqlite3.connect(dbname) print "Opened database successf ...
- Learn Rails5.2- ActiveRecord: sqlite3的用法, Query查询语法。乐观锁和悲观锁案例,查询语法includes(), 多态关联,destory和delete, Scope, Validats, Migrations
rails generate model photo title:string album:references 这会产生一个album_id列,当建立belongs_to关联时,需要用到. refe ...
- SQLite3学习笔记----创建数据库的两种方式
今天研究学习SQLite,刚开始创建数据库,就遇到了一个坑,是自己粗心了,特记录一下. 实验环境: OS:Ubuntu18.04 创建数据库名称:test.db 实验步骤: 1.检查是否已经安装了SQ ...
- Hibernate 笔记 HQL查询 条件查询,聚集函数,子查询,导航查询
在hibernate中进行多表查询,每个表中各取几个字段,也就是说查询出来的结果集并没有一个实体类与之对应,如何解决这个问题? 解决方案一,按照Object[]数据取出数据,然后自己组bean 解决方 ...
- SQLite3学习笔记(1)
命令: DDL-数据定义: CREATE -- 创建一个新的表,一个表的视图,或者数据库中的其他对象 ALTER -- 修改数据库中的某个已有的数据对象,比如一个表 DROP -- 删除整个表,或者表 ...
- MongoDB学习笔记六—查询下
查询内嵌文档 数据准备 > db.blog.find().pretty() { "_id" : ObjectId("585694e4c5b0525a48a441b5 ...
随机推荐
- C#学习笔记——变量、常量和转义字符
变量 变量是存储数值的容器,是一门程序语言的最基础的部分. 不同的变量类型可以存储不同类型的数值. 种类: 在C#种一共有14种变量: 有符号类型4种 无符号类型4种 浮点数3种 特殊类型(char ...
- ORACLE错误代码一览表,方便大家查询!
ORACLE错误一览表,方便大家查询! ORA-00001: 违反唯一约束条件 (.) ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最 ...
- oj练习题程序编程题
打印图形Description按要求输出由*组成的图案Input无需输入Output输出下面由"组成的图案卡 11 print('*') print("***") pri ...
- linux的认知与基本命令
一.linux的了解 1. 什么是Linux? a,Linux是一种免费使用和自由传播的类UNIX操作系统,其内核由林纳斯·本纳第克特·托瓦兹于1991年10月5日首次发布.它主要受到Mi ...
- DRTREE - Dynamically-Rooted Tree 题解
DRTREE - Dynamically-Rooted Tree 本题建议评蓝. 思路: 题目就是要对一颗不定根树求子树权值和. 这题不带修,如果带修难度会增加一点,就跟 遥远的国度 差不多. 首先分 ...
- [ABC201D] Game in Momotetsu World 题解
Game in Momotetsu World 题目大意 在一个 \(n\times m\) 的网格中,存在红色和蓝色两种格子,红色格子用 - 表示,蓝色格子用 + 表示. 现在 Takahashi ...
- 如何在 Ubuntu上使用snap安装Docker
1 检查系统版本 具有sudo或root用户权限 2 安装 SNAP ctrl+alt+T 打开终端 运行以下命令以安装 SNAP sudo apt update sudo apt install s ...
- Android_Camera2_ImageReader_onImageAvailable拍照秒退的解决办法
public void onImageAvailable(ImageReader reader) { try{ Image image = reader.acquireLatestImage();// ...
- Python输入某年某月某日,判断这一天是这一年的第几天?
while 1: year = int(input('year:\n')) #输入年.月.日 month = int(input('month:\n')) day = int(input('day:\ ...
- vue中export default function 和 export function 的区别
export default function 和 export function 的区别 // 第一种 export default function crc32() { // 输出 // ... ...