首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >highscore仅在启动sqlite时刷新

highscore仅在启动sqlite时刷新
EN

Stack Overflow用户
提问于 2014-04-28 16:51:12
回答 1查看 53关注 0票数 0

我有一个用SQLite实现的c++射手的高分系统,但它只有在我重新启动游戏时才会刷新,我想这是因为它只在游戏发布时从最大到最小重新排序。我不知道这是为什么,它似乎确实像它应该记录的所有游戏分数,但我认为它只在发布时订购。我如何才能让它在打印到屏幕之前重新排序。以下是代码

在main.cpp中

case eHIGH_SCORES:

代码语言:javascript
代码运行次数:0
运行
复制
    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();

然后在Database maker类中,我有

代码语言:javascript
代码运行次数:0
运行
复制
    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()
{
}
EN

回答 1

Stack Overflow用户

发布于 2014-04-28 18:07:18

那么,也许可以尝试将sqlite3_close语句从RetrieveRecordsFromTable成员函数中移出,也许是析构函数或分离函数?

因为您在第一次调用数据库后关闭了它的连接(这可能是通过重新运行您的应用程序来修复该问题的原因)。

另外,请考虑将此DatabaseMaker DatabaseMaker("MyDatabase.db");更改为:DatabaseMaker databaseMaker("MyDatabase.db");,否则在相同作用域中定义另一个DatabaseMaker可能会出现问题。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23336564

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档