Cocos2d-x3.2教程——【我所认识的Cocos2d-x】七、Cocos2d-x项目—数据管理器篇

本节暂定为我所认识的Cocos2d-x第一环节终章,以后我会直接用项目跟大家继续的探讨。
本节所讲的就是数据管理器和数据库的基础运用。
本篇所用的Cocos2d-x版本为:Cocos2d-x 3.2
编译器版本VS2013
CocosStudio 1.5

Cocos2d-x3.2教程——【我所认识的Cocos2d-x】
七、Cocos2d-x项目—数据管理器篇数据管理器,作为数据的持久化、存储、查找、更新、设置等数据的集中管理器,其实就是我们将数据全部统一放在一个地方,方便我们调用,我们先从数据库开始讲。
SQLite是适用非常广泛的嵌入式数据库,在中型或大型游戏中经常见到。
在cocos2d-x中,我们使用它的C语言绑定。为了方便和简化篇幅,我们直接使用它的源代码。我所用的数据库的下载地址:
http://www.sqlite.org/sqlite-amalgamation-3071000.zip
将其解压到我们项目classes目录下,里面有四个源文件。

shell.c
sqlite3.c
sqlite3.h
sqlite3ext.h

下面我就开始上代码了!做个简单的引导
首先我创建了一个数据库,大概内容是这样的


然后我定义了 公用结构体类Game_Struct.h将所有公用的结构体我全部放在这里,并方便调用
Game_Struct.h

#ifndef __GAME__STRUCT_H__
#define __GAME__STRUCT_H__

using namespace std;
#include 

//游戏分区结构体;
struct GameRegion
{
    string    GR_S_ID;            //选区ID;
    string    GR_S_Name;        //分区名字;
    string    GR_S_Http;            //选区地址;
    string    GR_S_State;            //选区状态: 0未开 1正常 2停服 X其他;
    string    GR_S_Time;            //开启时间;
    string    GR_S_DBName;        //服务器名称;
    string    GR_S_TallServer;    //聊天服务器;
    int        GR_B_IsOpen;        //是否可以注册;
    int        GR_B_IsReto;        //是否指定注册地址;
};

#endif //__GAME__STRUCT_H__

```

然后我们开始写数据库管理器,这里我只做一些初步的引导,如果想要详细的去了解,还是希望大家从基础的看起,因为我所理解的,不能代表你就理解了

GameSQLite.h

#ifndef __GAME_SQLITE_H__
#define __GAME_SQLITE_H__


#include "sqlite3.h"
#include "cocos2d.h"
#include "Game_Struct.h"
#include 

USING_NS_CC;
using namespace std;

class GameSQLite
{

public:
    //单例模式;
    static GameSQLite* getInstance();

public:
    //初始化;
    bool initSQLite();
    //获取服务器分区数据;
    vector GetGameRegionDataList(string fKey);
    

};

#endif //__GAME_SQLITE_H__

```


GameSQLite.cpp

#include "GameSQLite.h"

static GameSQLite*        m_pGameSQLite;
static sqlite3*            m_pSqliteDB;
//单例;
GameSQLite* GameSQLite::getInstance()
{
    if (m_pGameSQLite == nullptr)
    {
        m_pGameSQLite = new GameSQLite();

        if (m_pGameSQLite->initSQLite()){
            log("SQLite Data OK");
        }else{
            log("SQLite Data NO");
        }
    }
    return m_pGameSQLite;
}
//初始化;
bool GameSQLite::initSQLite()
{
    bool isOK = false;
    char * errMsg = nullptr;//错误信息;
    int result = -1;
    string sqlstr = "";
    string pathStr = FileUtils::getInstance()->fullPathForFilename("Test.db");
    if("Test.db" != pathStr){
        result = sqlite3_open(pathStr.c_str(), &m_pSqliteDB);
        if (result == SQLITE_OK){
            isOK = true;
        }
    }
    return isOK;
}
//读取GameRegion表数据;
vector GameRegion_list;
int Read_database_FFFlower_load(void * para, int n_column, char ** column_value, char ** column_name)
{
    GameRegion temp;

    //选区ID;
    temp.GR_S_ID = column_value == NULL ? "NULL" : column_value;
    //分区名字;
    temp.GR_S_Name = column_value == NULL ? "NULL" : column_value;
    //选区地址;
    temp.GR_S_Http = column_value == NULL ? "NULL" : column_value;
    //选区状态: 0未开 1正常 2停服 X其他;
    temp.GR_S_State = column_value == NULL ? "NULL" : column_value;
    //开启时间;
    temp.GR_S_Time = column_value == NULL ? "NULL" : column_value;
    //服务器名称;
    temp.GR_S_DBName = column_value == NULL ? "NULL" : column_value;
    //聊天服务器;
    temp.GR_S_TallServer = column_value == NULL ? "NULL" : column_value;
    //是否可以注册;
    temp.GR_B_IsOpen = atoi(column_value == NULL ? "NULL" : column_value);
    //指定注册地址;
    temp.GR_B_IsReto = atoi(column_value == NULL ? "NULL" : column_value);


    GameRegion_list.push_back(temp);
    return 0;
}
//获取服务器分区数据;
vector GameSQLite::GetGameRegionDataList(string fKey)
{
    GameRegion_list.clear();

    string sql = "select * from GameRegion";

    if (fKey.size() != 0)
    {
        sql.append(" a where a.ID in (");
        sql.append("'");
        sql.append(fKey.c_str());
        sql.append("'");
        sql.append(")");
    }
    char * errMsg = NULL;
    sqlite3_exec(m_pSqliteDB, sql.c_str(), Read_database_FFFlower_load, NULL, &errMsg);
    log("Get GameRegion Data OK");
    return GameRegion_list;
}

```

那么我们大概的讲解下,要想使用数据库,我们最少要知道基本的SQL语句,增、删、改、查!  Insert、delete、select、update。基本语法我们可以去问度娘!

那么,我们数据库管理器搭建好了,现在要做什么呢?用编写数据管理器来调用,数据库管理器,进行一些数据的持久化和查找所用。
开始上代码

GameData.h
#ifndef __GAME_DATA_H__
#define __GAME_DATA_H__

#include "Game_Struct.h"
#include 

using namespace std;

class GameData
{

public:
    //单例模式;
    static GameData* getInstance();                    

public:
    //初始化;
    void initData();
    //读取数据;
    void readData();
    //获取服务器分区数据;
    vector GetServer_GR_Data(string key);

public:
    
    
};

#endif //__GAME_DATA_H__

```


GameData.cpp

#include "GameData.h"
#include "PublicHeaderFiles.h"

static GameData* m_pGameData;                    
//单例;
GameData* GameData::getInstance()
{
    if (m_pGameData == nullptr)
    {
        m_pGameData = new GameData();
        m_pGameData->initData();
    }
    return m_pGameData;
}
//初始化;
void GameData::initData()
{
    
}
//读取数据;
void GameData::readData()
{
    
}
//获取服务器分区数据;
vector GameData::GetServer_GR_Data(string key)
{
    return GameSQLite::getInstance()->GetGameRegionDataList(key);
}

```

OK 数据管理器也最做好了!
这只是一个基本的思想和概念,具体怎么使用,我希望同学们能进一步的去思考,去完善!
那么我们简单的在代码里调用下,可以在某个UI类里随便的调用下,我们看下log
  

好的,目前基本上教程就暂时到这里结束了,很抱歉,最后一章草草的结束了,因为我想真正给大家打来一个项目,而不是挤时间给大家草草的去写,所以,我们的教材就暂时结束,后期我会开始用实例教程给同学们一起学习进步!

先顶再说:7::7:

:12: 这篇写的不好,最近工作心情不是很好,影响到教程了。。。。

请问下 我加入sqlite3.h 找不着 换成#include “sqlite3/include/sqlite3.h” 就找到了 但是貌似没有自动导入 sqlite3.lib 请问这个lib怎么加入 我试了各种路径都不行

嗯,期待下一环。
从第一篇看了一遍,着实有些收获。
有自己的风格。
赞一下。

我用的是C语言绑定的办法 是将4个源文件全部放入到 classer下面

一直在支持