1 打开数据库文件
sqlite3* m_db = NULL;
int ret = sqlite3_open_v2("test.db", &db, SQLITE_OPEN_READWRITE, NULL);
if (ret != SQLITE_OK)
{
return;
}
2 如果表不存在,创建表
char szCreateUserDataSql[1024] = "create table if not exists tb_user (id INTEGER ,\
type INTEGER,\
kind INTEGER)";
3 创建唯一的主键ID
char szCreateUserDataSql[1024] = "create table if not exists tb_user (id INTEGER PRIMARY KEY AUTOINCREMENT,\
type INTEGER,\
kind INTEGER)";
4 查询
char szSql[1024] = {0};
sprintf(szSql, "select distinct * from tb_test");
sqlite3_stmt* stmt = NULL;
sqlite3_prepare(m_db, szSql, -1, &stmt, 0);
while (sqlite3_step(stmt) == SQLITE_ROW)
{
const unsigned char* szPOIName = sqlite3_column_text(stmt, 0);
char szName[128] = {0};
if (szPOIName)
{
sprintf(szName, "%s", szPOIName);
}
int kx = sqlite3_column_int(stmt, 3);
float x = sqlite3_column_double(stmt, 5);
}
sqlite3_finalize(stmt);
5 获取sql执行失败的错误信息
char* errMsg = NULL;
char* szSql = "select * from address";
nRet = sqlite3_exec(pDB, szSql, NULL, NULL ,&errMsg);
if (nRet != SQLITE_OK)
{
cout<<errMsg<<endl;
sqlite3_free(errMsg);
}
注意:释放errMsg指向的内存
6 关闭数据库
sqlite3_close(db);
7迭代查询
char* pszSql = "select * from tableA where id >= ?"
当出现上面的sql语句的情况下,需要对?进行填充,这个时候就会
调用sqlite3_bind_int函数对该?进行填充
sqlite3_bind_int(stmt, 1, 2);
详细的说明:第二个参数表示对第一个?(可能有多个?),2表示填充到?
的值
对于使用回调和预编译语句获取记录集的方式比较
回调:一次性读取所有的记录集
预编译语句:每次使用sqlite3_step获取到一条记录了数据
代码:
sqlite3_stmt *stmt = NULL;
int ret = sqlite3_prepare();
ret = sqlite3_bind_int(stmt, 1, id);
ret = sqlite3_step(stmt);
const char *mst = sqlite3_errstr(ret);
分析:
1)
mst的错误提示:library routine called out of sequence
通过网上搜索是多线程访问数据库导致的问题,结果通读代码,发现没有多线程访问数据库,并且正常销毁stmt对象
2)
尝试手动执行命令语句,出错提示如下:no such column:admin
说明SQL语句有问题,测试sqlite3_prepare函数的返回值,出错提示如下:SQL logic error or missing database。通过修改SQL语句,终于可以正常查询。
总结:sqlite3_prepare函数会分析SQL语句是否编写正确,如果不正确就会返回错误,导致下面的查询失败