cocos2dx+xcode使用sqlite读取数据库的问题,有请大师指教

我是在windows下的项目移植到xcode
读取数据库原来 result=sqlite3_open(“db/save1.mydb”,&pdb);就可以了
现在要用完全的路径

result=sqlite3_open("/Users/joe/Documents/cocos2d-x-2.2.3/projects/Loading/Resources/db/save1.mydb",&pdb);才可以
数据库放在Resoruces目录的db文件夹里,
但是其他的图片资源不用完整的路径就可以加载,比如UI/image.jpg就可以加载了。
这个是什么原因,该如何解决

IOS6以后,app的权限管的严起来了,专门给app一个wirte权限的文件夹叫做document,

建议你在appDelegate中做一个操作,首次进入app时将本地数据库copy到document目录下,

之后的db路径使用document后的路径。

FileUtil 中有个方法getWriteablePath 便能直接拿到document目录。

有没有具体的cocos2dx这方面的例子,我刚使用xcode好多都不明白

我刚才试了一下,用:
std::string filename=CCFileUtils::sharedFileUtils()->fullPathForFilename(“db/save1.mydb”);
result=sqlite3_open(filename.c_str(),&pdb);
这样也可以打开,但是不知道在真机下会有什么问题吗?

— Begin quote from ____

引用第3楼jikerom于2014-11-02 19:35发表的 回 1楼(harris) 的帖子 :
我刚才试了一下,用:
std::string filename=CCFileUtils::sharedFileUtils()->fullPathForFilename(“db/save1.mydb”);
result=sqlite3_open(filename.c_str(),&pdb);
这样也可以打开,但是不知道在真机下会有什么问题吗? http://www.cocoachina.com/bbs/job.php?action=topost&tid=237396&pid=1088504

— End quote

恩 在真机环境下 ,你的app包里是没有write权限的,如果你的数据库只用作只读是没问题的 但是如果有insert操作,就会报错了。
把数据库copy到document下,就有write权限了。

谢谢指点。cocos2dx可有提供copy的方法吗?

// copy the game database into the writable path (document directory)
    string dbFilePath = CCFileUtils::sharedFileUtils()->fullPathForFilename(GAME_DB_NAME);
    string writablePath = createDownLoadUrl() + GAME_DB_NAME;
    
    unsigned long dbSize;
    CCFileUtils::sharedFileUtils()->getFileData(writablePath.c_str(), "r", &dbSize);
    if(!dbSize){
        std::fstream fsCopee( dbFilePath.c_str(), ios::binary | ios::in ) ;
        std::fstream fsCoper( writablePath.c_str(), ios::binary | ios::out ) ;
        fsCoper << fsCopee.rdbuf();
    }

```



string AppDelegate::createDownLoadUrl(){
    
    string pathToSave;
    pathToSave = CCFileUtils::sharedFileUtils()->getWritablePath();
    pathToSave += DOWNLOAD_PATH;
    
    // Create the folder if it doesn't exist
#if (CC_TARGET_PLATFORM != CC_PLATFORM_WIN32)
    DIR *pDir = NULL;
    
    pDir = opendir (pathToSave.c_str());
    if (!pDir)
    {
        mkdir(pathToSave.c_str(), S_IRWXU | S_IRWXG | S_IRWXO);
    }
#else
    if ((GetFileAttributesA(pathToSave.c_str())) == INVALID_FILE_ATTRIBUTES)
    {
        CreateDirectoryA(pathToSave.c_str(), 0);
    }
#endif
    return pathToSave;

}


```



这是我用来拷贝数据库的一段代码。

非常感谢,完美解决了,
昨天用fopen和fwrite方法也可以。