Cocos2dx 下对sqlite3 的简单封装

  • Post author:
  • Post category:其他


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