一、基础知识介绍
1.sqlite数据类型
NULL 空
INTEGER 整型
REAL 浮点型
TEXT 文本
BLOB 二进制对象 图片音频 视频
2.数据库增删改查语句
INSERT INTO TestTable(value1,value2) VALUES(?,?)
DELETE from TestTable where key = 2
UPDATE TestTable set value = 25000.00 where key=1;
SELECT * from TestTable
二、sqlite3函数介绍
1.打开数据库文件 如果不存在就创建
sqlite3_open()
sqlite3_open_v2()
sqlite3* db = NULL;
const char* path=" .../test.db" //必须是c语言字符串
//路径 数据库连接对象
if (sqlite3_open(path, &db) == SQLITE_OK)
{
}
sqlite3_open_v2 还可以在打开时设置一些参数:
SQLITE_OPEN_NOMUTEX: 设置数据库连接运行在多线程模式(没有指定单线程模式的情况下)
SQLITE_OPEN_FULLMUTEX:设置数据库连接运行在串行模式。
SQLITE_OPEN_SHAREDCACHE:设置运行在共享缓存模式。
SQLITE_OPEN_PRIVATECACHE:设置运行在非共享缓存模式。
SQLITE_OPEN_READWRITE:指定数据库连接可以读写。
SQLITE_OPEN_CREATE:如果数据库不存在,则创建。
2.关闭数据库文件
sqlite3_close(sqlite3* db);
if(db)
{
sqlite3_close(db);
db=nullptr;
}
3.解析和编译sql语句
解析并编译sql语句,将编译好的sql语句 存储到一个sqlite3_stmt的结构中
int sqlite3_prepare_v2(
sqlite3 *db, 数据库连接对象
const char *zSql, 使用UTF-8编码的Sql语句
int nBytes, 表示Sql语句的长度,如果为-1则全部读取zSql
sqlite3_stmt **ppStmt, OUT: 指向编译后的数据结构
const char **pzTail OUT: 如果zSql没有读取完,剩下的会被指向pzTail,pzTail一般传入NULL
)
const char *sqlCode = "....";
sqlite3_stmt *stmt = NULL;
if (sqlite3_prepare_v2(db, sqlCode, -1, &stmt, NULL) == SQLITE_OK) {
//todo
}
4.绑定参数
sql语句中的参数可以用"?“代替 ,使用sqlite3_bind_XXX() 将参数绑定到”?"的位置
参数1:sqlite3_stmt类型 Sql语句编译后的数据结构
参数2:int类型 表示需要代替的第几个问号
参数3:代替问号的值
参数4:有些接口没有,有的有,这里指绑定字节的长度,填-1就是全部读取
参数5:传入SQLITE_TRANSIENT或SQLITE_STATIC
SQLITE_TRANSIENT 指SQLite会在绑定后返回之前自己创建内存托管,一般使用这个
SQLITE_STATIC 指SQLite假定该信息位于静态非托管空间中,不需要释放,
const char *sql_select = "UPDATE mytable SET value= ? WHERE key =? ";
int InIntvalue = 1;
sqlite3_bind_text(stmt, 1, "aaa", -1, SQLITE_TRANSIENT);
sqlite3_bind_int(stmt, 2, InIntvalue);
5.执行语句
sqlite3_step(sqlite3_stmt *pStmt)
返回值:SQLITE_ROW指还没执行完,SQLITE_DONE指已经执行完成
if (sqlite3_step(stmt) == SQLITE_DONE) {
//todo
}
6.重置语句
sqlite3_reset(sqlite3_stmt *pStmt)
把sqlite3_stmt 结构重置到sqlite3_prepare_v2执行后sqlite3_step执行前的状态
7.获取结果集
sqlite3_column_XXX接口通过在sqlite3_step执行过后,从sqlite3_stmt的实例中获取查询到的结果,多用于查询
参数1:sqlite3_stmt的实例,结果集存储在内
参数2:iCol,查询结果的索引值
8.销毁语句
销毁sqlite3_prepare_XX方法创建的sqlite3_stmt实例
sqlite3_finalize(sqlite3_stmt *pStmt)
9.执行语句 合并版
sqlite3_exec语句相当于sqlite3_prepare_v2,sqlite3_step和sqlite3_finalize的封装,简便的同时对应着其效率会更低
三、示例:
1.创建数据库
sqlite3 *db = NULL;
if (sqlite3_open("test.db", &db) == SQLITE_OK) {
const char *sql_createtable = "CREATE TABLE testTable(key INTEGER,value TEXT)";
sqlite3_stmt *stmt = NULL;
if (sqlite3_prepare_v2(db, sql_createtable, -1, &stmt, NULL) == SQLITE_OK) {
if (sqlite3_step(stmt) == SQLITE_DONE) {
cout<<"create table done"<<endl;
}
sqlite3_reset(stmt);
}
sqlite3_finalize(stmt);
}
sqlite3_close(db);
2.插入 (增 、删、改的逻辑基本相同 )
sqlite3 *db = NULL;
if (sqlite3_open("test.db", &db) == SQLITE_OK) {
const char *sql_select = "INSERT INTO test_tbl(key,value) VALUES(?,?)";
sqlite3_stmt *stmt = NULL;
if (sqlite3_prepare_v2(db, sql_select, -1, &stmt, NULL) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, "test_key", -1, SQLITE_TRANSIENT);
sqlite3_bind_text(stmt, 2, "test_value", -1, SQLITE_TRANSIENT);
if (sqlite3_step(stmt) == SQLITE_DONE) {
cout<<"insert success"<<endl;
}
sqlite3_reset(stmt);
}
sqlite3_finalize(stmt);
}
sqlite3_close(db);
3.查询
sqlite3 *db = NULL;
if (sqlite3_open("test.db", &db) == SQLITE_OK) {
const char *sql_select = "SELECT value FROM test_tbl WHERE key=?";
sqlite3_stmt *stmt = NULL;
if (sqlite3_prepare_v2(db, sql_select, -1, &stmt, NULL) == SQLITE_OK) {
sqlite3_bind_text(stmt, 1, "test_key", -1, SQLITE_TRANSIENT);
while( sqlite3_step(stmt) == SQLITE_ROW )
{
int key=sqlite3_column_int(stmt,0);
const unsigned char* value =sqlite3_column_text(stmt,1);
}
sqlite3_reset(stmt);
}
sqlite3_finalize(stmt);
}
sqlite3_close(db);