高分仅在启动sqlite时刷新

时间:2014-04-28 08:51:12

标签: c++ sqlite

我有一个使用SQLite实现的高分系统,用于制作c ++射击游戏,但只有当我重新启动游戏时它才会刷新,我认为这是因为它只会在游戏发布时从大到小进行重新调整。我不知道为什么会这样,它似乎确实记录了所有游戏分数,但我认为它只是在发布时命令它们。我怎么能这样做才能在打印到屏幕之前重新订购。这是代码

在main.cpp

案例eHIGH_SCORES:

    DrawString( "HIGHSCORES", iScreenWidth * 0.38, iScreenHeight * 0.95);
    DrawString( "PRESS C TO CLOSE", iScreenWidth * 0.32, iScreenHeight * 0.1);

    DatabaseMaker DatabaseMaker("MyDatabase.db");
    DatabaseMaker.CreateDatabase();
    DatabaseMaker.CreateTable("HIGHSCOREST");
    if (scorer<1)
    {
    DatabaseMaker.InsertRecordIntoTable("HIGHSCOREST",scoreArray);
    scorer++;
    for (int i=0; i<10; i++)
    {
        scoreArray[i]=0;
    }
    }
    DatabaseMaker.RetrieveRecordsFromTable("HIGHSCOREST");
    DatabaseMaker.databaseprinter();

然后在数据库制作者课程中我有

    DatabaseMaker::DatabaseMaker(std::string HighScoresT)
    {
        this->HighScores = HighScoresT;
        myDatabase = NULL;  
     }


    int DatabaseMaker::Callback(void* notUsed, int numRows, char **data, char **columnName)
    {
        for(int i = 0; i < numRows; i++)
        {
            std::cout << columnName[i] << ": " << data[i] << std::endl;
            holder.push_back(atoi(data[i]));

         } 

    return 0;
}



void DatabaseMaker::databaseprinter()
{

        for (int i = 0; i < 10; i++)
    {
        itoa(holder[i], displayHolder, 10);
        DrawString(displayHolder,   780/2,  700-(50*i));
    }

}

void DatabaseMaker::CreateDatabase()
{
    int errorCode = sqlite3_open(HighScores.c_str(), &myDatabase); 

    if(errorCode == SQLITE_OK)
    {
        std::cout << "Database opened successfully." << std::endl;
    }
    else
    {
        std::cout << "An error has occured." << std::endl;
    }
}

void DatabaseMaker::CreateTable(std::string  HIGHSCOREST)
{

    char* errorMsg = NULL;
    std::string sqlStatement;  

    sqlStatement =  "CREATE TABLE HIGHSCOREST(" \
        "ID  INT," \
        "SCORE    INT);";

    sqlite3_exec(myDatabase, sqlStatement.c_str(), Callback, 0, &errorMsg);

    if(errorMsg != NULL)
    {
        std::cout << "Error message: " << errorMsg << std::endl;
    }
}



void DatabaseMaker::InsertRecordIntoTable(std::string HIGHSCOREST,int (&scoreArray)[10] )
{
    char*errorMsg = NULL;
    std::string sqlStatement;
    int x=5;


    for(int i=0;i<10;i++)
    {
        std::string scorestring;

        scorestring = std::to_string(scoreArray[i]);

        sqlStatement =  "INSERT INTO HIGHSCOREST (ID,SCORE)" \
            "VALUES (1,"+scorestring+");";

        sqlite3_exec(myDatabase, sqlStatement.c_str(), Callback, 0, &errorMsg);

        if(errorMsg != NULL)
        {
            std::cout << "Error message: " << errorMsg << std::endl;
        }
    }

}

void DatabaseMaker::RetrieveRecordsFromTable(std::string HIGHSCOREST)
{

    char* errorMsg = NULL;
    std::string sqlStatement;

    sqlStatement =  "SELECT SCORE from HIGHSCOREST order by SCORE desc;";

    sqlite3_exec(myDatabase, sqlStatement.c_str(), Callback, 0, &errorMsg);

    if(errorMsg != NULL)
    {
        std::cout << "Error message: " << errorMsg << std::endl;
    }

    sqlite3_close(myDatabase); 


}


DatabaseMaker::~DatabaseMaker()
{
}

1 个答案:

答案 0 :(得分:0)

好吧,也许尝试将sqlite3_close语句移出RetrieveRecordsFromTable成员函数,可能是析构函数还是单独函数?

由于您在第一次调用数据库后关闭了与数据库的连接(这可能是重新运行应用程序解决问题的原因)。

另外,请考虑将此DatabaseMaker DatabaseMaker("MyDatabase.db");更改为:DatabaseMaker databaseMaker("MyDatabase.db");,否则您可能无法在同一范围内定义另一个DatabaseMaker