Search code examples
c++sqliteandroid-sqlitecocos2d-x

Can't create SQLite table in C++ (android)


I'm making a cocos2dx (c++) android game and I'm trying to implement SQLite but I can't even create a table!

Here's the function where i open database and create a table inside:

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);
    }
}

And here is my sql_query() function:

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;
}

When I run my game, save.db file is created but there's no table inside, it's EMPTY! (0 bytes). And it gives me NO errors, it gives me just an empty save.db file.

How can I solve this problem? THANKS!


Solution

  • I tested your code and I could create the data table.

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

    I see you're calling sql_query with only one parameter. Did you overload that method or did you define default argument values? Anyway here's the code I use. Note that you can call isFileExist instead of 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;
    }