Cocos2dx 下对sqlite3 的简单封装

来源:互联网 发布:淘宝联盟看不到高佣金 编辑:程序博客网 时间:2024/05/17 22:52

DBUtil.h:

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();


原创粉丝点击