SQLite的使用
Posted 牧秦丶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQLite的使用相关的知识,希望对你有一定的参考价值。
最近频繁使用到 SQLite,越来越发现该数据库的好用。SQLite 是一款开源、轻量、本地化存储、功能强大的数据库,由于它的这些特性,使得人们在项目中广泛应用。
首先,你可能要去www.sqlite.org去下载一份 SQLite,可能是编好的,如果没有,你可能需要自己去编一份,过程非常简单。先来看看 SQLite 在工程中的使用。
它提供 sqlite3.h、sqlite3.lib、sqlite3.dll 这三份必需文件,我们只需在工程中含入 sqlite3.h,链入sqlite3.lib,在打包时提供 sqlite3.dll 副本即可,非常的简单。而它的 API 接口也非常清晰好用,先来个总体介绍:
sqlite3 -- 数据库连接
sqlite3_stmt -- SQL语句
sqlite3_open -- 打开数据库,返回SQLITE_OK表示打开成功
sqlite3_close -- 关闭数据库
sqlite3_key -- 为数据库设置加密Key,在sqlite3_open之后调用
sqlite3_rekey -- 更改数据库的加密Key,如果之前数据库未加密,则进行加密;如果两个参数均为0,则进行解密
sqlite3_exec -- 执行一条SQL语句,成功返回SQLITE_OK
sqlite3_sleep -- 将执行挂起一段时间
sqlite3_table_column_metadata -- 获取表的某一列的属性(类型、列名、是否为null、是否是主键、是否是auto-increment)
sqlite3_prepare -- 准备SQL语句
sqlite3_finalize -- SQL语句执行完毕,进行销毁释放
sqlite3_db_handle -- 通过sqlite3_stmt获取sqlite3指针
sqlite3_bind_int -- 绑定一个整数到SQL语句的某个参数
sqlite3_bind_double -- 绑定一个浮点数到SQL语句的某个参数
sqlite3_bind_text -- 绑定一个字符串到SQL语句的某个参数
sqlite3_bind_blob -- 绑定一个内存块到SQL语句的某个参数
sqlite3_column_int -- 获取查询结果,按整型值返回
sqlite3_column_text -- 获取查询结果,按字符串返回
sqlite3_column_bolb -- 获取查询结果,按缓冲返回
sqlite3_column_bytes -- 获取查询结果某一列值的内存字节数,可结合sqlite3_column_blob使用
sqlite3_sql -- 查看sqlite3_stmt进行绑定后产生的SQL语句
sqlite3_bind_parameter_count -- 查看sqlite3_stmt的参数个数
sqlite3_bind_parameter_name -- 查看sqlite3_stmt的某个参数的列名
sqlite3_bind_parameter_index -- 查看sqlite3_stmt的某个列名对应的参数索引
sqlite3_clear_bindings -- 清除所有已绑定到sqlite3_stmt上的参数
sqlite3_reset -- 清除已绑定到sqlite3_stmt上的参数,但不清楚通过sqlite3_bind_blob绑定的参数
sqlite3_column_count -- 获取查询结果的列数
sqlite3_data_count -- 同上
sqlite3_column_type -- 获取查询结果中某一列的值类型
sqlite3_column_name -- 获取查询结果中某一索引对应的列名
sqlite3_column_database_name -- 获取sqlite3_stmt执行对应的数据库名
sqlite3_column_table_name -- 获取sqlite3_stmt执行对应的表名
sqlite3_step -- 执行stmt语句,返回SQLITE_ROW表示查询到数据,返回SQLITE_DONE表示成功,其他值为失败
sqlite3_changes -- 获取执行SQL语句影响的行数,包括INSERT、UPDATE、DELETE,触发器产生的不计在内
sqlite3_total_changes -- 同上,但包含触发器产生的影响计数
sqlite3 和 sqlite3_stmt 均是结构体,我们需要用指针来操作。看起来 API 比较多,但只要理解了,就非常好用,这些 API 还有提供 V2 版本以及基于 UTF-16 的宽字符版本的,比如 sqlite3_open_v2、sqlite3_column_text16 等等,参数基本不变。下面看一个实际示例:
#include <sqlite/sqlite3.h>
#include <iostream>
#include <string>
using namespace std;
#pragma comment(lib, "sqlite3.lib")
sqlite3* OpenDatabase(const string& strDbFile)
sqlite3* pdb = 0;
sqlite3_open(strDbFile.c_str(), &pdb);
return pdb;
int main()
// 打开数据库连接.
sqlite3* pDatabase = OpenDatabase("D:\\\\mytest.db");
if (!pDatabase)
return -1;
const char* const CREATE_TABLE =
"create table t_person("
"id integer primary key,"
"name varchar(50) not null,"
"age integer not null"
")";
// 创建表.
if (SQLITE_OK != sqlite3_exec(pDatabase, CREATE_TABLE, 0, 0, 0))
return -1;
string strName = "Bill Gates";
int age = 42;
// 准备 SQL 语句,参数用 ? 替代.
const char* const INSERT_STMT =
"insert into t_person values("
"null, ?, ?"
");";
sqlite3_stmt* pstmt = 0;
const char* pTail = 0;
sqlite3_prepare(pDatabase, INSERT_STMT, -1, &pstmt, &pTail);
if (!pstmt)
return -1;
// 绑定参数,第一个参数的索引为 1 .以此类推.
sqlite3_bind_text(pstmt, 1, strName.c_str(), -1, SQLITE_STATIC);
sqlite3_bind_int(pstmt, 2, age);
if (SQLITE_DONE == sqlite3_step(pstmt))
cout<<"Add Person Successful!"<<endl;
// 销毁释放.
sqlite3_finalize(pstmt);
const char* const QUERY_STMT =
"select * from t_person;";
sqlite3_stmt* pQueryStmt = 0;
sqlite3_prepare(pDatabase, QUERY_STMT, -1, &pQueryStmt, &pTail);
if (pQueryStmt)
while (SQLITE_ROW == sqlite3_step(pQueryStmt))
// 获取数据,第 1 列从 0 开始,以此类推.
int nPersonID = sqlite3_column_int(pQueryStmt, 0);
const unsinged char* pszPersonName = sqlite3_column_text(pQueryStmt, 1);
int nPersonAge = sqlite3_column_int(pQueryStmt, 2);
if (pszPersonName)
cout<<"ID: "<<nPersonID<<"\\n"
<<"Name: "<<pszPersonName<<"\\n"
<<"Age: "<<nPersonAge<<endl;
sqlite3_finalize(pQueryStmt);
// 关闭数据库连接.
slqite3_close(pDatabase);
return 0;
看起来一副非常简单的样子,反正我是信了。SQLite 还支持事务的操作,你只需在要执行的操作前后加上事务语句即可:
sqlite3_exec("begin transaction;");
// 进行 INSERT、UPDATE、DELETE等多项操作
// ...
// ...
sqlite3_exec("commit transaction;");
以上是关于SQLite的使用的主要内容,如果未能解决你的问题,请参考以下文章
如何解决android.database.sqlite.SQLiteException:没有这样的表错误?
在 iPhone 上将多行插入 sqlite db 的最快方法