[数据库]_[初级]_[sqlite3简单使用]
场景
1.sqlite3在很多小型项目都会用到, 比如用来存储Android的联系人,短信等. 这个小巧的sqlite3是文件型的数据库, 也方便做配置文件和程序打包. 使用sql查询也方面. 所以sqlite3在非结构化数据时比xml来的方便, 高效,省空间.
2.在移动开发盛行的年代, sqlite3是必备的技术了.
说明
1.以下是sqlite3常见的增删改查操作和一些注意事项.
2.比json,xml文件更小更容易查询, 可以使用软件SqliteBrowser来管理DB. 麻烦就是不能使用文本编辑器直接查看. 建议用于比较多的设置选项保存.
3.sqlite3是开源的数据库, 代码质量很高, 阅读源码也可以从中学到很多东西. 用C写代码的话有个缺点就是在增量打开资源时, 每次如果if条件不成立也需要按顺序释放. 可以使用C++的特性 std::shared_ptr 解决.
例子
#include "gtest/gtest.h"
#include <Windows.h>
#include <memory>
#include "sqlite3.h"
using namespace std;
static int PCallback(void* data,int argc,char** argv,char** err)
{
auto count = (int*)data;
*count = atoi(argv[0]);
return 0;
}
bool TestSqlite3Api()
{
sqlite3* db = NULL;
sqlite3_stmt* query = NULL;
int ret = 0;
// 创建DB文件
// 如果不需要创建db文件,使用sqlite3_open即可
ret = sqlite3_open_v2("test.db",&db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
if (SQLITE_OK != ret)
return false;
std::shared_ptr<sqlite3> sp_db(db,[](sqlite3* db)
{
std::cout << "sqlite3_close" << std::endl;
sqlite3_close(db);
});
// 创建表
std::string create = "CREATE TABLE IF NOT EXISTS items (userid INTEGER PRIMARY KEY, ipaddr"
" TEXT,username TEXT,useradd TEXT,userphone INTEGER,age INTEGER, "
"time TEXT NOT NULL DEFAULT"
" (NOW()));";
// 注意,如果使用了sqlite3_stmt不关闭的话调用sqlite3_close是返回 SQLITE_BUSY 失败的.
sqlite3_stmt *create_stmt = NULL;
ret = sqlite3_prepare(db, create.c_str(), create.size(), &create_stmt, NULL);
if(SQLITE_OK != ret)
return false;
std::shared_ptr<sqlite3_stmt> create_sp(create_stmt,[](sqlite3_stmt* stmt)
{
std::cout << "sqlite3_finalize create_stmt" << std::endl;
sqlite3_finalize(stmt);
});
if (sqlite3_step(create_stmt) != SQLITE_DONE)
return false;
// 插入表数据
string insert = "INSERT INTO items (time, ipaddr,username,useradd,userphone,age) "
"VALUES ('7:30', '192.187.27.55','vivekanand','kolkatta','04456823948',74);"; // WORKS!
sqlite3_stmt *insert_stmt = NULL;
ret = sqlite3_prepare(db, insert.c_str(), insert.size(), &insert_stmt, NULL);
if(SQLITE_OK != ret)
return false;
std::shared_ptr<sqlite3_stmt> insert_sp(insert_stmt,[](sqlite3_stmt* stmt)
{
std::cout << "sqlite3_finalize insert_stmt" << std::endl;
sqlite3_finalize(stmt);
});
ret = sqlite3_step(insert_stmt);
if (ret != SQLITE_DONE)
return false;
// 查询表数据
string select = "select count(0) from items;";
sqlite3_stmt *select_stmt = NULL;
ret = sqlite3_prepare(db, select.c_str(), select.size(), &select_stmt, NULL);
if(SQLITE_OK != ret)
return false;
std::shared_ptr<sqlite3_stmt> select_sp(select_stmt,[](sqlite3_stmt* stmt)
{
std::cout << "sqlite3_finalize selectStmt" << std::endl;
sqlite3_finalize(stmt);
});
//1. 查询方式1
ret = sqlite3_step(select_stmt);
int count = 0;
while(ret == SQLITE_ROW )
{
count+= sqlite3_column_int(select_stmt,0);
break;
}
std::cout << "frist select count: " << count << std::endl;
//2. 查询方式2
count = 0;
ret = sqlite3_exec(db,"select count(0) from items;",PCallback,&count,NULL);
if(ret != SQLITE_OK)
return false;
std::cout << "second select count: " << count << std::endl;
return true;
}
TEST(test_sqlite3,TestSqlite3)
{
ASSERT_TRUE(TestSqlite3Api(),SQLITE_OK);
}
输出
Note: Google Test filter = test_sqlite3.TestSqlite3
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from test_sqlite3
[ RUN ] test_sqlite3.TestSqlite3
frist select count: 1
second select count: 1
sqlite3_finalize selectStmt
sqlite3_finalize insert_stmt
sqlite3_finalize create_stmt
sqlite3_close
[ OK ] test_sqlite3.TestSqlite3 (296 ms)
[----------] 1 test from test_sqlite3 (312 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (328 ms total)
参考
C-language Interface Specification for SQLite
[数据库]_[初级]_[sqlite3简单使用]的更多相关文章
- [ATL/WTL]_[初级]_[关于graphics.DrawImage绘图时显示不正常的问题]
场景 1.使用win32绘图时, 最简单的api是使用 graphics.DrawImage(image,x,y)来绘制, 可是这个api有个坑,它的图片显示完整和设备分辨率(显卡)有关. 说明 1. ...
- [C/C++标准库]_[初级]_[转换UTC时间到local本地时间]
场景 1.如果有面向全球用户的网站, 一般在存储时间数据时存储的是UTC格式的时间, 这样时间是统一的, 并可以根据当地时区来进行准确的转换. 2.存储本地时间的问题就在于如果换了时区, 那么显示的时 ...
- [Zlib]_[初级]_[使用zlib库压缩和解压STL string]
场景 1.一般在使用文本json传输数据, 数据量特别大时,传输的过程就特别耗时, 因为带宽或者socket的缓存是有限制的, 数据量越大, 传输时间就越长. 网站一般使用gzip来压缩成二进制. 说 ...
- [C/C++11]_[初级]_[std::bind介绍和使用]
场景 1.C++11 引入了std::function 对象, 这个对象可以通过std::bind封装所有的函数, 并通过代理调用这个std::function的方式调用这个函数. 比如通过统一的方式 ...
- [ATL/WTL]_[初级]_[选择目录对话框]
场景 1.起因是创建标准选择目录对话框时使用了 SHCreateItemFromParsingName 函数, 这个函数支持vista以上系统. 之后再winxp上运行就报错: 无法定位程序输入点 S ...
- boost/lexical_cast.hpp的简单使用方法_行动_新浪博客
boost/lexical_cast.hpp的简单使用方法_行动_新浪博客 boost/lexical_cast.hpp的简单使用方法 (2010-03-19 16:31:13) ...
- Python面试题_初级版
1.如何在一个函数内部修改全局变量 a=5 def fn(): a=4 fn() print(a) # 5 #在一个函数内部修改全局变量 a=5 def fn(): global a a=4 fn() ...
- 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好
HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...
- [转]Oracle数据库ASH和AWR的简单介绍
在Oracle数据库中,有时我们可能会遇到这样的术语:ASH和AWR,那么它们是怎样产生的呢?它们的作用又是什么呢?本文我们就来介绍这一部分内容. 1.10g之前 用户的连接将产生会话,当 ...
随机推荐
- 发布MVCIIS报错未能加载文件或程序
未能加载文件或程序集“System.Web.Http.WebHost, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e3 ...
- Flask的数据库连接池 DBUtils
Flask是没有ORM的操作的,如果在flask中连接数据库有两种方式 一.pymysql 二.SQLAlchemy 是python操作数据库的以一个库,能够进行orm映射官网文档 sqlchemy ...
- 如何添加设备UDID到开发者中心
如何添加设备UDID到开发者中心 1. 登录开发者中心 2. 选择证书那一项 3. 选择Devices 4. 点选+按钮 5. 填上设备的UUID以及设备名字然后添加上 大功告成:) 附录: 如何获取 ...
- Linux 系统的/目录
根目录下的重要目录 目录 应放置档案内容 /bin 系统有很多放置执行档的目录,但/bin比较特殊.因为/bin放置的是在单人维护模式下还能够被操作的指令.在/bin底下的指令可以被root与一般帐号 ...
- Linux tar命令详解
当你想要压缩一大堆文件时,你得先将这一大堆文件先打成一个包(tar命令),然后再用压缩程序进行压缩(gzip bzip2命令) tar常见命令参数 必要参数有如下: -A 新增压缩文件到已存在的压缩 ...
- win10WLAN没有有效的ip配置
方案一:将路由器和猫重启一下,一般都可以解决了!方案二:1.在开始菜单上单击鼠标右键,选择“命令提示符(管理员)”,如果没有找到这个选项,通过cortana搜索cmd,右键以管理员身份运行,还可以进入 ...
- (1)基于tcp协议的编程模型 (2)tcp协议和udp协议的比较 (3)基于udp协议的编程模型 (4)反射机制
1.基于tcp协议的编程模型(重中之重)1.1 编程模型服务器: (1)创建ServerSocket类型的对象,并提供端口号: (2)等待客户端的连接请求,调用accept()方法: (3)使用输入输 ...
- 设计模式之——单例模式(Singleton)的常见应用场景(转):
单例模式(Singleton)也叫单态模式,是设计模式中最为简单的一种模式,甚至有些模式大师都不称其为模式,称其为一种实现技巧,因为设计模式讲究对象之间的关系的抽象,而单例模式只有自己一个对象,也因此 ...
- elif 相当于else&if
if 条件: 语句块 elif 条件: 语句块 ... else #elif好像要有一个else作为结尾
- docker 不同版本 添加--insecure-registry
docker 17.0.3 vim /lib/systemd/system/docker.service 然后重启 systemctl daemon-reload , systemctl rest ...