DBUtil.h:sql
class DBUtil{ public: /************************************************************ 封装 sqlite3操做 ************************************************************/ //用来建立一个db数据库 db为数据库的名字 // 打开数据库 static void initDB(const char *db); //用来判断表格是否存在 // name:表示表名 static bool tableIsExist(string name); //用来建立一个表名为name的表格,建立时会先匹配时否有该表的存在若是存在则不建立 //建立表 static void createTable(string sql,string name); //用来删除一张表名为name的表格,删除时会先匹配是否有该表的存在若是不存在则不执行删除操做 //删除表名 static void deleteTable(string sql,string name); //用来向表中插入一条数据 //插入一条数据 static void insertData(string sql); //用来向表中删除一条数据 //删除一条数据 static void deleteData(string sql); //用来向表中修改一条数据 // 修改一条数据 static void updateData(string sql); //获取一个记录的条数 // 得到记录的条数 static int getDataCount(string sql); //读取一条记录的信息 /* * 此方法是查询方法,至关之重要,pSender最好是个vector */ static void getDataInfo(string sql,void *pSend); //关闭打开的数据库 static void closeDB(); };
DBUtil.cpp:数据库
sqlite3 *pDB = NULL;//数据库指针 char * errMsg = NULL;//错误信息 std::string sqlstr;//SQL指令 int result;//sqlite3_exec返回值 //建立数据库 void DBUtil::initDB(const char *db ) { //打开一个数据库,若是该数据库不存在,则建立一个数据库文件 result = sqlite3_open(db, &pDB); if( result != SQLITE_OK ) CCLog( "打开数据库失败,错误码:%d ,错误缘由:%s\n" , result, errMsg ); } //tableIsExist的回调函数 int isExisted( void * para, int n_column, char ** column_value, char ** column_name ) { bool *isExisted_=(bool*)para; *isExisted_=(**column_value)!='0'; return 0; } //判断表格是否存在 bool DBUtil::tableIsExist( string name ) { if (pDB!=NULL) { //判断表是否存在 bool tableIsExisted; sqlstr = "select count(type) from sqlite_master where type='table' and name ='"+name+"'"; result =sqlite3_exec(pDB,sqlstr.c_str(),isExisted,&tableIsExisted,&errMsg); return tableIsExisted; } return false; } //在数据库中判断名为name的表示否存在,若是不存在则建立这张表 //@示例语句string sqls = "create table user(id integer,username text,password text)"; void DBUtil::createTable( string sql,string name ) { if (!tableIsExist(name)) { //建立表,设置ID为主键,且自动增长 result = sqlite3_exec(pDB,sql.c_str(),NULL,NULL,&errMsg); if( result != SQLITE_OK ) CCLog( "建立表失败,错误码:%d ,错误缘由:%s\n" , result, errMsg ); } } //删除表格 //@示例语句sqlstr="drop table name"; void DBUtil::deleteTable( string sql,string name ) { if (tableIsExist(name)) { result = sqlite3_exec(pDB,sql.c_str(),NULL,NULL,&errMsg); if( result != SQLITE_OK ) CCLog( "建立表失败,错误码:%d ,错误缘由:%s\n" , result, errMsg ); } } //插入数据 //@示例语句sqlstr=" insert into MyTable_1( name ) values ( '擎天柱' ) "; void DBUtil::insertData( string sql ){ result = sqlite3_exec( pDB, sql.c_str() , NULL, NULL, &errMsg ); if(result != SQLITE_OK ) CCLog( "插入记录失败,错误码:%d ,错误缘由:%s\n" , result, errMsg ); } //删除数据 //@示例语句sqlstr="delete from MyTable_1 where ID = 2"; void DBUtil::deleteData( string sql ) { result=sqlite3_exec( pDB, sql.c_str() , NULL, NULL, &errMsg ); if(result != SQLITE_OK ) CCLog( "插入记录失败,错误码:%d ,错误缘由:%s\n" , result, errMsg ); } //修改数据 //@示例语句 sqlstr="update MyTable_1 set name='威震天' where ID = 3"; void DBUtil::updateData( string sql ) { result = sqlite3_exec( pDB, sql.c_str() , NULL, NULL, &errMsg ); if(result != SQLITE_OK ) CCLog( "插入记录失败,错误码:%d ,错误缘由:%s\n" , result, errMsg ); } //getDataCount的回调函数 int loadRecordCount( void * para, int n_column, char ** column_value, char ** column_name ) { int *count=(int*)para; *count=n_column; return 0; } //获取记录的条数 //@示例语句string sqlsssss = "select count(*) from user"; //@示例语句 取得表格字段的语句string sqlsssss = "select * from user"; int DBUtil::getDataCount( string sql ) { int count=0; sqlite3_exec( pDB, sql.c_str() , loadRecordCount, &count, &errMsg ); return count; } //getDataInfo的回调函数 int loadRecord( void * para, int n_column, char ** column_value, char ** column_name ) { CCLOG("n_column:%d",n_column); // TestVO* testVO = (TestVO*)para; // testVO->mId = atoi(column_value[0]); // testVO->level = atoi(column_value[1]); // testVO->lastscore = atoi(column_value[2]); // testVO->bestscore = atoi(column_value[3]); // testVO->star = atoi(column_value[4]); /* 可能有5个字段 */ // id level lastscore bestscore star // CCLOG("c[0]:%s,c[1]:%s,c[2]:%s,c[3]:%s,c[4]:%s",column_name[0],column_name[1],column_name[2],column_name[3],column_name[4]); // CCLog("id=%s,level=%s,lastscore=%s,bestscore=%s,star=%s",column_value[0],column_value[1],column_value[2],column_value[3],column_value[4]); return 0; } //获取一条记录的信息 其中的pSend是一个实体类咱们之后能够自定义一个继承了CCObject的类来代替他保存数据库中取出来的数据 /* * 这里最好扩展下,让 pSend 是一个vector */ void DBUtil::getDataInfo( string sql,void *pSend ) { sqlite3_exec( pDB, sql.c_str() , loadRecord, pSend, &errMsg ); } //关闭数据库 void DBUtil::closeDB() { sqlite3_close(pDB); }
测试:函数
// Test Database string fullDBPath = CCFileUtils::sharedFileUtils()->getWriteablePath() + "save.db"; CCLOG("fullPath : %s",fullDBPath.c_str()); //打开数据库 DBUtil::initDB(fullDBPath.c_str()); string createTableSql = "create table zuma (id integer primary key autoincrement,level integer,lastscore integer,bestscore integer,star integer);"; DBUtil::createTable(createTableSql.c_str(),"zuma"); //向表格中插入数据 string sqlss = "insert into zuma (level,lastscore,bestscore,star) values (100,100,500,1)"; /* 插入一条数据 */ DBUtil::insertData(sqlss); // 更新 string updateString = "update zuma set star = 5;"; DBUtil::updateData(updateString); /* 查询数据 */ string selectStr = "select * from zuma"; // CCObject* pp = new CCObject(); // DBUtil::getDataInfo(selectStr, pp); TestVO* testVO = new TestVO(); testVO->mId = 1111; DBUtil::getDataInfo(selectStr,testVO); /* 显示结果 */ CCLOG("id:%d",testVO->mId); CCLOG("level:%d",testVO->level); CCLOG("lastscore:%d",testVO->lastscore); CCLOG("bestscore:%d",testVO->bestscore); CCLOG("star:%d",testVO->star); delete testVO; /* 不能忘记关闭数据库 */ DBUtil::closeDB();