Cocos2d-x分享一个封装的Sqlite3的DBUtil类
发布日期:2021-05-14 02:24:24 浏览次数:18 分类:精选文章

本文共 3557 字,大约阅读时间需要 11 分钟。

在Cocos2d-x中使用Sqlite作为游戏持久化的解决方案是一个值得推荐的选择。在移动设备上,相比Json或Xml文件956945353的IO操作,Sqlite更具优势。文件读写往往会导致延迟,尤其是在游戏启动时需要大量数据加载,这样的操作会占用大量内存,影响性能。

在游戏循环中执行文件IO或数据库操作是很危险的,因为这会占用大量CPU资源,可能导致帧率下降。尽管Sqlite的执行时间较快,但具体情况还需根据数据库规模判断。对于100条记录的查询,仅需1ms,这相比帧率限制(约16ms)是可接受的。因此,建议在游戏循环之外进行数据库操作。

我实现了一个简化的DBUtil类,适用于Cocos2d-x项目中的数据库操作。这一类库包装了常见的增删改查及事务处理功能,供开发者直接调用。以下是我对2.x版本和3.x版本的实现细节:

在2.x版本中,DBUtil.h定义了数据库操作的接口,包括表的创建、删除、查询记录及数据条数等功能。DBUtil.cpp实现了单例模式,确保数据库操作的高效性。同一函数库在3.x版本中接近,但部分实现细节有所差异。

以下是DBUtil的完整代码库:

頭文字ą
intąż

分版本说明

2.x版本

// DBUtil.h LeadinV1.1
#ifndef __LeardinV1_1__DBUtil__
#define __LeardinV1_1__DBUtil__
#include "sqlite3.h"
USING_NS_CC;
class DBUtil {
private:
sqlite3* m_pDataBase;
private:
DBUtil();
DBUtil(const DBUtil& other);
DBUtil& operator = (const DBUtil& other);
~DBUtil();
public:
static DBUtil* getInstance();
static void destroyInstance();
void openDBWithName(const string& name);
void closeDB();
void createTable(const string& sql, const string& name);
bool isExistTableByName(const string& name);
void deleteTable(const string& sql, const string& name);
void insertData(const string& sql);
void deleteData(const string& sql);
void updateData(const string& sql);
vector
>> searchData(const string& sql);
int searchDataCount(const string& sql);
int beginTransaction();
int commitTransaction(int result);
};
#endif
// DBUtil.cpp LeadinV1.1
#include "DBUtil.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include < элекitre ⁣ #include < multiset> #include

3.x版本

// DBUtil.h GuessMovie
#ifndef __GuessMovie__DBUtil__
#define __GuessMovie__DBUtil__
#include "sqlite3.h"
#include "main.h"
USING_NS_CC;
class DBUtil {
private:
sqlite3* m_pDataBase;
DBUtil();
virtual ~DBUtil();
public:
static DBUtil* getInstance();
static void destroyInstance();
void openDBWithName(const std::string& name);
void closeDB();
void createTable(const std::string& sql, const std::string& name);
bool isExistTableByName(const std::string& name);
void deleteTable(const std::string& sql, const std::string& name);
void insertData(const std::string& sql);
void deleteData(const std::string& sql);
void updateData(const std::string& sql);
std::vector
> searchData(const std::string& sql);
int searchDataCount(const std::string& sql);
int beginTransaction();
int commitTransaction(int result);
};
#endif
// DBUtil.cpp GuessMovie
#include "DBUtil.h"
using namespace std;
static DBUtil* s_pInstance = NULL;
const string cDBName = "gamedb";
#pragma marks
DBUtil::DBUtil() : m_pDataBase(NULL) {}
DBUtil::~DBUtil() {}
static DBUtil* getInstance() {
if (!s_pInstance) s_pInstance = new DBUtil();
return s_pInstance;
}
void destroyInstance() {
delete s_pInstance;
s_pInstance = NULL;
}
void DBUtil::openDBWithName(const string& name) {
string writablePath = FileUtils::getInstance()->getWritablePath();
string dbPath = writablePath + name;
int result = sqlite3_open(dbPath.c_str(), &m_pDataBase);
char* errMsg = NULL;
if (result != SQLITE_OK) {
log("Database opening failed with error %d: %s", result, errMsg);
}
if (errMsg) sqlite3_free(errMsg);
}
// … 其他实现细节

usage说明

在项目DAO层调用DBUtil的getInstance()方法即可,例如:

DBUtil::getInstance()->createTable("CREATE TABLE ...");

上述代码为对DbUtil的完整实现,涵盖创建表、删除表、查询记录等功能,适用于Cocos2d-x游戏开发。

上一篇:修练8年C++面向对象程序设计之体会
下一篇:我理解中的cocos2dx之Node

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2025年04月20日 02时04分32秒