cocos2dx sqlite3存储信息

前端之家收集整理的这篇文章主要介绍了cocos2dx sqlite3存储信息前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

参考的是http://blog.csdn.net/ym19860303/article/details/8531998这篇文章来学习的,同时也有同事的帮忙,写下来的目的是为了防止某一天自己忘记了,可以回来看看。

首先用cocos2dx3.9创建了一个项目newhello,之后导入down下来的sqlite3(不要schell.c)添加完后,如图:


之后新建一个类,将http://blog.csdn.net/ym19860303/article/details/8531998里.h和.cpp内容copy进来,做一小点修改(根据自己的内容修改),修改后如何

.h文件如下

#ifndef DBUtil_h
#define DBUtil_h

#include <stdio.h>
#include "sqlite3.h"

//自定义
struct StudentInfo
{
    int             nID;    //id
    std::string     sName;  //姓名
    int             nAge;   //年龄
    int             nscore; //分数
};


class DBUtil
{
public:
    /************************************************************
     封装 sqlite3操作
     ************************************************************/
    //用来创建一个db数据库 db为数据库的名字
    //  打开数据库
    static void initDB(const char *db);
    
    //用来判断表格是否存在
    // name:表示表名
    static bool tableIsExist(std::string name);
    
    
    //用来创建一个表名为name的表格,创建时会先匹配时否有该表的存在如果存在则不创建
    //创建表
    static void createTable(std::string sql,std::string name);
    
    //用来删除一张表名为name的表格,删除时会先匹配是否有该表的存在如果不存在则不执行删除操作
    //删除表名
    static void deleteTable(std::string sql,std::string name);
    
    //用来向表中插入一条数据
    //插入一条数据
    static void insertData(std::string sql);
    
    //用来向表中删除一条数据
    //删除一条数据
    static void deleteData(std::string sql);
    
    //用来向表中修改一条数据
    // 修改一条数据
    static void updateData(std::string sql);
    
    //获取一个记录的条数
    // 获得记录的条数
    static int getDataCount(std::string sql);
    
    //读取一条记录的信息
    /*
     *  此方法查询方法,相当之重要,pSender最好是个vector
     */
    static void getDataInfo(std::string sql,void *pSend);
    
    //关闭打开的数据库
    static void closeDB();

    static StudentInfo m_studentInfo;
};

#endif /* DBUtil_hpp */


.cpp文件如下:

#include "DBUtil.h"

sqlite3 *pDB = NULL;//数据库指针
char * errMsg = NULL;//错误信息
std::string sqlstr;//sql指令
int result;//sqlite3_exec返回值

StudentInfo DBUtil::m_studentInfo = {0};

//创建数据库
void DBUtil::initDB(const char *db )
{
    //打开一个数据库,如果该数据库不存在,则创建一个数据库文件
    result = sqlite3_open(db,&pDB);
    if( result != sqlITE_OK )
    {
       CCLOG( "打开数据库失败,错误码:%d ,错误原因:%s\n",result,errMsg );
    }
}


//tableIsExist的回调函数
int isExistedTable( void * para,int n_column,char ** column_value,char ** column_name )
{
    bool *isExisted_=(bool*)para;
    *isExisted_=(**column_value)!='0';
    return 0;
}


//判断表格是否存在
bool DBUtil::tableIsExist( std::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(),isExistedTable,&tableIsExisted,&errMsg);
        return tableIsExisted;
    }
    return false;
}


//在数据库中判断名为name的表示否存在,如果不存在则创建这张表
//@示例语句string sqls = "create table user(id integer,username text,password text)";
void DBUtil::createTable( std::string sql,std::string name )
{
    if (!tableIsExist(name))
    {
        CCLOG("不存在创建表");
        //创建表,设置ID为主键,且自动增加
        result = sqlite3_exec(pDB,sql.c_str(),NULL,&errMsg);
        if( result != sqlITE_OK )
        {
            CCLOG( "创建表失败,错误码:%d ,错误原因:%s\n",errMsg );
        }
    }
}


//删除表格
//@示例语句sqlstr="drop table name";
void DBUtil::deleteTable( std::string sql,std::string name )
{
    if (tableIsExist(name))
    {
        result = sqlite3_exec(pDB,errMsg );
        }
    }
}


//插入数据
//@示例语句sqlss = "insert into stuInfo (id,name,age,score) values (1601,'张三',19,90)"

void DBUtil::insertData( std::string sql )
{
    result = sqlite3_exec( pDB,&errMsg );
    if(result != sqlITE_OK )
    {
        CCLOG( "插入记录失败,错误码:%d ,错误原因:%s\n",errMsg );
    }
}


//删除数据
//@示例语句sqlstr="delete from MyTable_1 where ID = 2";
void DBUtil::deleteData( std::string sql )
{
    result=sqlite3_exec( pDB,errMsg );
    }
}


//修改数据
//@示例语句     updateString = "update stuInfo set score = 95;"
void DBUtil::updateData( std::string sql )
{
    result = sqlite3_exec( pDB,errMsg );
    }
}


//getDataCount的回调函数
int loadRecordCount( void * para,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( std::string sql )
{
    int count=0;
    sqlite3_exec( pDB,loadRecordCount,&count,&errMsg );
    return count;
}


//getDataInfo的回调函数
int loadRecord( void * para,char ** column_name )
{
    CCLOG("n_column:%d",n_column);
    
    
    /*    根据用户自定义表里面的格式来获取具体的信息    */
    StudentInfo studentInfo={};
    std::string str = column_value[0];
    studentInfo.nID = atoi(str.c_str());
    str = column_value[1];
    studentInfo.sName = str;
    str = column_value[2];
    studentInfo.nAge = atoi(str.c_str());
    str = column_value[3];
    studentInfo.nscore = atoi(str.c_str());
    
    DBUtil::m_studentInfo = studentInfo;
    
    /*    根据表里面的格式来获取具体的信息    */
    
    for (int i=0; i<n_column; i++)
    {
        std::string str = column_value[i];
        
        printf("%s:%s  ",column_name[i],column_value[i]);
    }
    printf("\n");
    return 0;
}


//获取一条记录的信息 其中的pSend是一个实体类我们以后可以自定义一个继承了CCObject的类来代替他保存数据库中取出来的数据
/*
 *  这里最好扩展下,让  pSend  是一个vector
 */
void DBUtil::getDataInfo( std::string sql,void* pSend ) //( std::string sql,void *pSend )
{
    /*      用户自定义      */
    m_studentInfo = *(StudentInfo *)pSend;
    CCLOG("id= %d",m_studentInfo.nID);

    
    sqlite3_exec( pDB,loadRecord,pSend,&errMsg );
}


//关闭数据库
void DBUtil::closeDB()
{
    sqlite3_close(pDB);
}


可以发现,与参考的博客基本一样,哈哈!

之后就是如何运用了,来看看HelloWorldScene是怎么写的(头文件别忘记引用#include "DBUtil.h")
.h文件

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"
#include "DBUtil.h"
USING_NS_CC;

//struct StudentInfo
//{
//    int             nID;    //id
//    std::string     sName;  //姓名
//    int             nAge;   //年龄
//    int             nscore; //分数
//};

class HelloWorld : public cocos2d::Layer
{
public:
    static cocos2d::Scene* createScene();

    virtual bool init();
    
    void menuCloseCallback(cocos2d::Ref* pSender);
    
    CREATE_FUNC(HelloWorld);
    
    
    void readTable();
};

#endif // __HELLOWORLD_SCENE_H__


.cpp 文件如何:

#include "HelloWorldScene.h"



Scene* HelloWorld::createScene()
{
    // 'scene' is an autorelease object
    auto scene = Scene::create();
    
    // 'layer' is an autorelease object
    auto layer = HelloWorld::create();

    // add layer as a child to scene
    scene->addChild(layer);

    // return the scene
    return scene;
}

// on "init" you need to initialize your instance
bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    auto closeItem = MenuItemImage::create(
                                           "CloseNormal.png","CloseSelected.png",CC_CALLBACK_1(HelloWorld::menuCloseCallback,this));
    
	closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2,origin.y + closeItem->getContentSize().height/2));

    // create menu,it's an autorelease object
    auto menu = Menu::create(closeItem,NULL);
    menu->setPosition(Vec2::ZERO);
    this->addChild(menu,1);

    auto label = Label::createWithTTF("Hello World","fonts/Marker Felt.ttf",24);
    
    label->setPosition(Vec2(origin.x + visibleSize.width/2,origin.y + visibleSize.height - label->getContentSize().height));

    this->addChild(label,1);

    auto sprite = Sprite::create("HelloWorld.png");

    sprite->setPosition(Vec2(visibleSize.width/2 + origin.x,visibleSize.height/2 + origin.y));

    this->addChild(sprite,0);
    
    readTable();
    return true;
}

void HelloWorld::readTable()
{
    std::string fullDBPath = FileUtils::getInstance()->getWritablePath() + "save.db";
    
    CCLOG("fullPath : %s",fullDBPath.c_str());
    
    //打开数据库
    DBUtil::initDB(fullDBPath.c_str());
    
    //创建表
//    std::string createTablesql = "create table zuma (id integer primary key autoincrement,name char(10),age int,score int);"; //创建表,设置ID(此处为integer)为主键primary key,且自动增加autoincrement
    std::string createTablesql = "create table stuInfo (id int,score int);";
    DBUtil::createTable(createTablesql.c_str(),"stuInfo");
    
    //向表格中插入数据
    std::string sqlss = "insert into stuInfo (id,90)";
    
    /* 插入一条数据 */
    DBUtil::insertData(sqlss);
    
    // 更新
    std::string updateString = "update stuInfo set score = 95;";
    
    DBUtil::updateData(updateString);
    
    /* 查询数据 */
    std::string selectStr = "select * from stuInfo";
    //DBUtil::getDataInfo(selectStr,0);
    
    StudentInfo studentInfo;
    studentInfo.nID = 1601;

    DBUtil::getDataInfo(selectStr,&studentInfo);
    studentInfo = DBUtil::m_studentInfo;
    CCLOG("id = %d",studentInfo.nID);
    CCLOG("name = %s",studentInfo.sName.c_str());
    CCLOG("age = %d",studentInfo.nAge);
    CCLOG("score = %d",studentInfo.nscore);
    
    /* 不能忘记关闭数据库 */
    DBUtil::closeDB();
}


void HelloWorld::menuCloseCallback(Ref* pSender)
{
    Director::getInstance()->end();

#if (CC_TARGET_PLATFORM == CC_PLATFORM_IOS)
    exit(0);
#endif
}


之后运行Xcode后,显示打印信息为

<pre name="code" class="cpp">fullPath : /var/mobile/Containers/Data/Application/1F7B08E5-36C1-4C00-B89B-D900EA35A1EC/Documents/save.db
不存在创建表
id= 1601
n_column:4
id:1601  name:张三  age:19  score:95  
id = 1601
name = 张三
age = 19
score = 95
2016-01-19 14:44:22.061 newhello-mobile[6059:1366321] cocos2d: surface size: 1136x640

 
 


ok,完了,最后再上传一份完整的项目代码,(上传完居然显示不出来,好吧,以后再上传)贴上地址: 例子的开门钥匙

猜你在找的Cocos2d-x相关文章