Cocos2dx中sqlite3的使用

这篇博客介绍了在Cocos2d-x 3.17.2版本中如何使用sqlite3数据库。作者在实践中遇到并解决了使用CCLOG()函数导致的编译错误。提供了DBHelper类的头文件和源文件示例,并分享了一个通过Navicat创建SQLite表的简单示例。尽管相关文档稀缺,但作者成功实现了数据库操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当前cocos2dx版本3.17.2

sqlite3

大体上参考这位前辈https://blog.51cto.com/shahdza/1614851

如果自己测试时报这种错

严重性    代码    说明    项目    文件    行    禁止显示状态
错误    LNK2019    无法解析的外部符号 "__declspec(dllimport) void __cdecl cocos2d::CCLog(char const *,...)" (__imp_?CCLog@cocos2d@@YAXPBDZZ),该符号在函数 "public: static void __cdecl DBHelper::openDB(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?openDB@DBHelper@@SAXV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) 中被引用    cpp-empty-test    D:\Learning\GameCoding\cocos2d-x-3.17.2\tests\cpp-empty-test\proj.win32\DBHelper.obj    1    

 

错在我在数据库操作类DBHelper中使用CCLOG()函数,原因不明,反正不用那个CCLog就无事。

我自己的测试类(亲测可行)

DBHelper.h

#pragma once
#include "sqlite3.h"
#include "cocos2d.h"
using namespace  std;

class DBHelper
{
public:
	DBHelper(void);
	~DBHelper(void);

	static sqlite3 *pDB;//数据库指针 
	static char * errMsg;//错误信息 
	static int result;//sqlite3_exec返回值 
	static std::string path;//数据库路径
	static std::string sql;//sql语句

	static void openDB();//打开数据库
	static int addTest(int id,string name);//添加记录
	static int delTest(int id);//删除记录
	static int updateTest(int id, string newname);//修改记录
	static vector<vector<string>> searchTest();//查询记录
	static void closeBD();
};

DBHelper.cpp

#include "DBHelper.h"

sqlite3* DBHelper::pDB = NULL;
char* DBHelper::errMsg;
int DBHelper::result = 0;
string DBHelper::path = "res/datas/test.db3";
string DBHelper::sql = "";
DBHelper::DBHelper(void)
{


}
DBHelper::~DBHelper(void)
{

}

void DBHelper::openDB()
{
	result = sqlite3_open(path.c_str(), &pDB);
	//if (result != SQLITE_OK);
		//CCLog("读取数据库失败,错误码:%d ,错误原因:%s\n", result, errMsg);
}

int DBHelper::addTest(int id, string name)
{
	openDB();
	sql = "insert into test values(";
	sql.append(to_string(id));
	sql.append(",'");
	sql.append(name);
	sql.append("')");
	result = sqlite3_exec(pDB, sql.c_str(), nullptr, nullptr, &errMsg);
	closeBD();
	return result;
}

int DBHelper::delTest(int id)
{
	openDB();
	sql = "delete from test where ID=";
	sql.append(to_string(id));
	result = sqlite3_exec(pDB, sql.c_str(), nullptr, nullptr, &errMsg);
	closeBD();
	return result;
}

int DBHelper::updateTest(int id, string newname)
{
	openDB();
	sql = "update test set NAME='";
	sql.append(newname);
	sql.append("' where ID=");
	sql.append(to_string(id));
	result = sqlite3_exec(pDB, sql.c_str(), nullptr, nullptr, &errMsg);
	closeBD();
	return result;
}

vector<vector<string>> DBHelper::searchTest()
{
	openDB();
	char **table;
	int r, c;//row,column
	sql = "select * from test";
	result = sqlite3_get_table(pDB, sql.c_str(), &table, &r, &c, &errMsg);
	//结果总共r+1行,第0行(0,c-1)为字段名
	//第1行(c,2*c-1)为第一条记录
	//我将结果保存在向量容器中
	vector<vector<string>> rt(r+1, vector<string>(c));
	for (int i = 0; i <= r; i++) {//行
		for (int j = 0; j < c; j++) {//列
			rt[i][j] = table[i*c + j];
		}
	}
	//释放查询表
	sqlite3_free_table(table);
	closeBD();
	return rt;
}

void DBHelper::closeBD()
{
	if (NULL != pDB) {
		result = sqlite3_close(pDB);
		pDB = NULL;
	}
}

test.db里的表我用工具Navicat建立的,表名test,字段就俩:ID,NAME

工具链接:https://www.navicat.com.cn/download/navicat-for-sqlite

调用测试

void MainGame::dbTest()
{
	auto a=DBHelper::addTest(1, "tom");
	auto b=DBHelper::addTest(2, "jack");
	auto c=DBHelper::delTest(1);
	auto d=DBHelper::updateTest(2, "rose");
	auto cont = DBHelper::searchTest();
}

请看效果(result=0表示结果正常)

不知道是不是因为这个技术落后了?我看网上许多cocos2dx相关的文档资料很少,找到的也是4,5年前的别人的回答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值