【问题标题】:Can't create SQLite table in C++ (android)无法在 C++ (android) 中创建 SQLite 表
【发布时间】: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


【解决方案1】:

我测试了你的代码,我可以创建data 表。

SQLite version 3.16.2 2017-01-06 16:32:41
Enter ".help" for usage hints.
sqlite> .tables
data

我看到你只用一个参数调用sql_query。您是否重载了该方法或是否定义了默认参数值?无论如何,这是我使用的代码。请注意,您可以调用isFileExist 而不是fopen

MainMenu::MainMenu() {
  std::string wpath = FileUtils::getInstance()->getWritablePath() + "save.db";
    bool firstLogin = FileUtils::getInstance()->isFileExist(wpath);

    int 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)", nullptr, nullptr);
    }
}

int MainMenu::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;
}

【讨论】:

  • 谢谢我解决了这个问题。我不确定是什么原因。但我做了一些更改(使用 isFileExist() 而不是 fopen)并解决了。
猜你喜欢
  • 2012-03-26
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多