一个sqlite3封装类,后缀叫.h 还是叫.cpp 呢, 一般来说.h 和 .cpp 是分开写的, .h 只声明头文件,.cpp 来实现
但这里为了简单,把声明和实现放到一起了, 所以叫.h或.cpp 都可以, 这里就叫db.cpp 吧,代码如下:
实现了创建表,使用表的演示:
/* * author: hjjdebug * date: 2011 * sqlite 数据库,包含4个文件sqlite3.lib sqlite3.dll sqlite3.h sqlite3.def * 用navicat for sqlite 工具观察数据库文件.sqlite 文件 * 我很佩服开源精神。 * 一个简单sqlite的封装类,留个纪念吧 */ #include "sqlite3.h" #include "stdio.h" #include "stdlib.h" #include <vector> #include <string.h> #define DEBUGLEVEL 5 using namespace std; #ifndef WIN32 #define _atoi64(val) strtoll(val,NULL,10) #endif class ClipNode { public: int beginVideoPts; int endVideoPts; }; class DbClip { sqlite3 *db; public: int open(const char *filePath) { int ret = sqlite3_open(filePath, &db); return ret; } int create() { char sql[1000] = "create table clips(id integer primary key, bpts integer, epts integer, create_time datetime);"; int ret=sqlite3_exec(db,sql,0,0,0); return ret; } int insert(int id, int start, int end) { char sql[1000]; sprintf(sql,"insert into clips values (%d, %d, %d, datetime('now','localtime'));", id, start,end); return sqlite3_exec(db,sql,0,0,0); } int queryMaxId() { sqlite3_stmt * stmt; //stmt->statement, 语句 char sql[1000] = "select max(id) from clips;"; sqlite3_prepare(db,sql,-1,&stmt,0); int rc = sqlite3_step(stmt); if(rc==SQLITE_ROW) { int n = sqlite3_column_int(stmt,0); return n; } return -1; } int query(vector<ClipNode> &allNodes, vector <int> &ids) { char sql[512*1024]; char buffer[256]; int n_row=0, n_column=0; char **azResult; //存放结果 sprintf(sql,"select bpts, epts from clips where id in (%d",ids[0]); // sprintf(sql,"select bpts from clips;"); for(unsigned i=1; i<ids.size(); i++) { // itoa(ids[i],buffer,10); sprintf(buffer,"%d",ids[i]); strcat(sql,","); strcat(sql,buffer); } strcat(sql,");"); int rt=sqlite3_get_table(db,sql,&azResult,&n_row,&n_column,NULL); #if (DEBUGLEVEL > 3) printf("getTable rt:%d\n",rt); printf("sentense:\n%s\n",sql); //其中nrow为行数,ncolum为列数 printf("\nThe result of querying is : \n"); for(int i=1;i<n_row+1;i++) { for(int j=0;j<n_column;j++) printf("%s ",azResult[i*n_column+j]); printf("\n"); } #endif int index=2; // 跳开开始的一个空元素 ClipNode node; for(int i=0; i<n_row; i++) { node.beginVideoPts =_atoi64(azResult[index]); node.endVideoPts = _atoi64(azResult[index+1]); index+=2; allNodes.push_back(node); } return true; } int close() { return sqlite3_close(db); } };
补充一个测试程序main.cpp, 包含上上面文件db.cpp
#include <iostream> #include <stdio.h> #include "db.cpp" const char *tdb = "testDb.db"; int main(void) { vector<ClipNode> allNodes; vector<int> ids; DbClip *db = new DbClip(); int rt=db->open(tdb); printf("open rt is %d\n",rt); //0 is succeed. SQLITE_OK rt =db->create(); printf("create rt is %d\n",rt); //0 is succeed. 1. SQLITE_ERROR rt=db->insert(1,1,2); printf("insert rt is %d\n",rt); //0 is succeed. 19. SQLITE_CONSTRAINT db->insert(2,2,5); db->insert(3,2,8); int id=db->queryMaxId(); printf("maxID is %d\n",id); ids.push_back(1); ids.push_back(2); ids.push_back(3); db->query(allNodes,ids); db->close(); return 0; }把玩一下,就能对sqlite3 的使用有个入门级了解了.