1

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

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

  1. 使用 CCFileUtils::getFileData() 将 sqlite 文件读入 char*
  2. 使用标准 ofstrem 将 char* 写入 CCFileUtils::getWriteablePath() 中的文件(在 android 中为 /data/data/xxx/xx)
  3. 比您可以在步骤 2 中使用 sqlite3_open() 打开文件

我遇到的问题是,当我插入数据库时​​,原始文件没有被更新,即步骤 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();
4

1 回答 1

3

assets 文件夹是只读的(并且已打包),因此如果要保存任何新的/更改的数据,唯一可以执行此操作的地方是可写目录。这意味着只有可写目录中的数据库包含正确和最新的数据,即只有这个才是真正的数据库。

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

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

于 2013-06-06T20:07:50.577 回答