1. SQLite3数据库基础操作与实战解析
SQLite作为轻量级的关系型数据库,在嵌入式系统和移动应用中广泛应用。相比MySQL等大型数据库,它无需单独服务进程,直接通过本地文件操作实现数据存储,特别适合单机应用和小型项目。
1.1 数据库连接与表操作
SQLite的基本操作遵循"打开-操作-关闭"的标准流程。我们先看一个完整的创建表并插入数据的示例:
c复制#include <sqlite3.h>
#include <stdio.h>
int main() {
sqlite3 *db;
int rc = sqlite3_open("example.db", &db);
if (rc != SQLITE_OK) {
fprintf(stderr, "无法打开数据库: %s\n", sqlite3_errmsg(db));
return 1;
}
const char *create_table_sql =
"CREATE TABLE IF NOT EXISTS users ("
"id INTEGER PRIMARY KEY AUTOINCREMENT,"
"name TEXT NOT NULL,"
"email TEXT UNIQUE);";
char *err_msg = NULL;
rc = sqlite3_exec(db, create_table_sql, NULL, NULL, &err_msg);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL错误: %s\n", err_msg);
sqlite3_free(err_msg);
sqlite3_close(db);
return 1;
}
sqlite3_close(db);
return 0;
}
关键点解析:
sqlite3_open()打开或创建数据库文件,返回数据库连接对象sqlite3_exec()执行SQL语句,可以执行任何SQL命令- 错误处理必须检查每个API调用的返回值
- 最后必须调用
sqlite3_close()释放资源
提示:SQLite支持大多数标准SQL语法,包括CREATE、INSERT、UPDATE、DELETE等操作,但某些高级特性如存储过程不支持。
1.2 批量数据插入与事务处理
当需要插入大量数据时,逐条执行INSERT语句效率极低。SQLite默认每个语句都是一个独立事务,频繁提交会导致性能问题。解决方案是显式使用事务:
c复制// 开始事务
sqlite3_exec(db, "BEGIN TRANSACTION;", NULL, NULL, NULL);
for(int i=0; i<1000; i++) {
char sql[256];
sprintf(sql, "INSERT INTO users (name, email) VALUES ('user%d', 'user%d@example.com');", i, i);
sqlite3_exec(db, sql, NULL, NULL, NULL);
}
// 提交事务
sqlite3_exec(db, "COMMIT;", NULL, NULL, NULL);
实测对比:
- 不使用事务:插入1000条记录约需2.3秒
- 使用事务:同样数据仅需0.05秒
事务的四个特性(ACID):
- 原子性(Atomicity):事务内的操作要么全部成功,要么全部失败
解锁全文
加入我们的会员,获取最新、最热、最精彩的开发者技术内容