【发布时间】:2017-11-25 15:31:08
【问题描述】:
我正在制作一个 cocos2dx (c++) android 游戏,我正在尝试实现 SQLite,但我什至无法创建表!
这是我打开数据库并在其中创建表的函数:
void HelloWorld::initDB() {
#if CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID
std::string wpath = FileUtils::getInstance()->getWritablePath() + "save.db";
FILE *f = fopen(wpath.c_str(), "r");
if (f == NULL) {
firstLogin = true;
} else {
firstLogin = false;
}
fclose(f);
#endif
int result;
result = sqlite3_open(wpath.c_str(), &db);
if (result != SQLITE_OK) {
CCLOG("open database failed, number %d", result);
}
if(firstLogin) {
sql_query("CREATE TABLE IF NOT EXISTS data(variable, value)");
insertVariableInt("coins", 0);
insertVariableInt("timesPlayed", 0);
insertVariableInt("highScore", 0);
}
}
这是我的 sql_query() 函数:
int HelloWorld::sql_query(const char * query,int (*callback)(void*,int,char**,char**), void* data)
{
char* errMsg = 0;
int result = sqlite3_exec(db, query, callback, data, &errMsg);
if (errMsg) {
CCLOG("SQLite3: %s", errMsg);
sqlite3_free(errMsg);
}
return result;
}
当我运行我的游戏时,save.db 文件被创建,但里面没有表,它是空的! (0 字节)。它没有给我任何错误,它只给了我一个空的 save.db 文件。
我该如何解决这个问题?谢谢!
【问题讨论】:
-
我猜你的
firstLogin逻辑是错误的。你为什么首先使用它? -
@CL。我使用 firstLogin 变量来检测数据库是否存在。如果存在,则不要创建/插入值。但是如果 firstLogin 等于 true,它应该创建表并插入值。我使用它是因为我不想一次又一次地向表中插入值。我应该用什么来代替那个
-
您不想检测数据库文件是否存在,而是要检测表及其数据是否存在。
标签: c++ sqlite android-sqlite cocos2d-x