Android 在cocos2d-x中插入SQLITE

Android 在cocos2d-x中插入SQLITE,android,sqlite,android-sqlite,cocos2d-x,sql-insert,Android,Sqlite,Android Sqlite,Cocos2d X,Sql Insert,我正在使用cocos2d-x在android中创建一个需要使用数据库的应用程序 我在搜索论坛时发现,我使用了以下方法在cocos2d-x中使用SQLITE: 使用CCFileUtils::getFileData()将sqlite文件读入字符* 使用标准ofstrem将字符*写入CCFileUtils::getWriteablePath()中的文件(在android is/data/data/xxx/xx中) 然后可以使用sqlite3_open()在步骤2中打开文件 我遇到的问题是,当我插入数据

我正在使用cocos2d-x在android中创建一个需要使用数据库的应用程序

我在搜索论坛时发现,我使用了以下方法在cocos2d-x中使用SQLITE:

  • 使用CCFileUtils::getFileData()将sqlite文件读入字符*
  • 使用标准ofstrem将字符*写入CCFileUtils::getWriteablePath()中的文件(在android is/data/data/xxx/xx中)
  • 然后可以使用sqlite3_open()在步骤2中打开文件
  • 我遇到的问题是,当我插入数据库时,原始文件没有更新,即步骤1中的sqlite文件没有更新,而步骤2中的文件没有更新。现在,当应用程序重新启动时,步骤2中文件中的数据将被覆盖,因此将丢失所有插入数据

    这是我的密码:

    string dbPath = CCFileUtils::sharedFileUtils()->getWritablePath();
    dbPath.append("DischargedNew.mp3");
    unsigned long tmpSize;
    unsigned char *xmlData = CCFileUtils::sharedFileUtils()->getFileData("Discharged.mp3", "rb", &tmpSize);
    FILE *fp = fopen(dbPath.c_str(), "wb");
    fwrite(xmlData, tmpSize, 1, fp);
    fclose(fp);
    
    if(result = db->open((char*) dbPath.c_str()))
    {
        CCLog("DB Opened");
        db->query("INSERT INTO USERS (Name, Username, Email) VALUES ('Test Test', 'T', 'test@test.com');");
    }
    else
    {
        CCLog("OPENING WRONG, %d, MSG:%s", result, db->getError().c_str());
    }
    
    
    db->close();
    

    “资产”文件夹是只读的(并且已打包),因此如果要保存任何新的/更改的数据,唯一可以执行此操作的位置是在可写目录中。 这意味着只有可写目录中的数据库包含正确且最新的数据,即只有该数据库才是实际的数据库

    资产文件夹中的文件不应视为实际的数据库文件;将其视为仅帮助您初始化实际数据库的数据。 进行任何更改后,资产文件夹中的文件已过时

    启动程序时,首先检查可写目录中的数据库文件是否存在。
    只有当它还不存在时,才可以通过从资产文件夹复制文件来初始化它。

    那么您的问题是代码用错误的数据覆盖了文件?否。当程序退出时,步骤1中的文件(原始数据库文件)不会被更新以考虑插入的新数据。如果我尝试两次插入相同的数据,一次又一次,第二次我会得到一个错误,因为用户名是主键。但是,如果我重新启动程序并执行完全相同的查询,它将成功执行。这可能是因为正在使用的原始数据库文件不会每次更新以反映更改。当可写副本已经存在时,您不应该覆盖它。我不太明白您的意思。您是否确实知道创建数据库副本的原因?干杯,非常感谢。我想,我感到困惑的是,每次都要重新创建可写目录中的文件,因此我一直遇到问题。还有一个问题,我是否可以通过将数据库作为参数传入终端中的sqlite3来打开可写目录中的数据库?它只是简单地跟踪数据,而不是执行SELECT语句并打印它们。