当前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年前的别人的回答。