比如要用一个已经编好的数据库文件来获取游戏中的资源(只读),貌似很难啊,有没有方法做到呢?
在assets文件夹下,在cocos2d-x中根本找不到资源,应该是在apk里了,查看CCFileUtil 里的代码,发现使用资源都是从apk包中解压出来的数据,那么sqlite在c++中 sqlite3_open( const char *filename, sqlite3 **ppDb )这个函数是不是没用可能使用了。。。?还有要是想assets下判断某个文件是否存在怎么办?
- 本帖最后由 topzkz 于 2012-6-11 16:58 编辑 *
怎么会把游戏资源放数据库里,太非主流了
— Begin quote from ____
topzkz 发表于 2012-6-11 13:54 url
怎么会把游戏资源放数据库里,太非主流了
— End quote
?
没有这个意思啊
简单来说 就是如何才能打开放在assets资源路径下的sqlite
这个应该需要自己写…是个大工程, 而且还可以压缩数据库,到时再解压(我用过gZip),而且效率很高,起码非智能平台都能很好的支持,其实用惯数据库会感觉到很爽的,游戏资源可以统一归置。
我说的有些问题吧 ,主要想问的是怎么读取assets文件夹下的sqilte
看来貌似不太可能 ,只能在游戏中将其考入可写path了
刚看了下 android下封装的sqlite也不支持读取assets下的sqlite,只能考入data/data/那个路径里再用了
- 本帖最后由 topzkz 于 2012-6-12 15:37 编辑 *
— Begin quote from ____
zfqlcl 发表于 2012-6-11 18:32 url
这个应该需要自己写…是个大工程, 而且还可以压缩数据库,到时再解压(我用过gZip),而且效率很高,起码 …
— End quote
首先,游戏配置大部分是为了修改游戏方便。
其次,使用数据库有个基本原则,就是不将存档再存档(可以简单理解为数据库可以存放资源路径,但不存放资源本身)
相对来说,配置和资源放在数据库里,违背以上原则。
除非,大型游戏,游戏资源超多,可以考虑配置数据库化+配置工具。
请问这个问题解决了吗?我也是受这个问题的困扰。发现在data里面的mydatabase.sqlite文件是空的,怎么不可以从assets里面拷这个文件到data/data/projectName?
private static String DB_PATH = “/data/data/org.cocos2dx.projectName/databases/”;
private static String DB_NAME = “mydatabase.sqlite”;
private static String ASSETS_NAME = “mydatabase.sqlite”;
private void copyBigDataBase() throws IOException{
InputStream myInput;
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
myInput = this.getAssets().open(ASSETS_NAME);
byte] buffer = new byte;
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myInput.close();
myOutput.close();
}
void DBManager::initialize()
{
//打开一个数据库,如果该数据库不存在,则创建一个数据库文件
string path = CCFileUtils::getWriteablePath();
path += “…/pirate/dataFiles/mydatabase.sqlite”;
result = sqlite3_open(path.c_str(), &pDB);
}
— Begin quote from ____
lzfssyy 发表于 2012-6-18 10:50 url
请问这个问题解决了吗?我也是受这个问题的困扰。发现在data里面的mydatabase.sqlite文件是空的,怎么不可 …
— End quote
sqlite想拷到data/data/下使用是可以的,你想在android那层实现的话,网上例子很多的
我现在这个问题还未解决,在C++代码里面解决不了,我想在C++里面就直接拷那个文件过去,但是拷过去是空的,“你想在android那层实现的话,网上例子很多的”,但是我不知道怎么查,所以找不到。。。请求帮助
string path = “mydatabase.sqlite”;
string o_path=CCFileUtils::getWriteablePath()+path;
unsigned long size=0;
unsigned char *data=CCFileUtils::getFileData(path.c_str(),“r”,&size);//reinterpret_cast<char *>
const char *c_data=reinterpret_cast<char *>(data);
ofstream os(o_path.c_str(), ios::binary);
os.write(c_data,strlen(c_data));
这样是可以读到sqlite文件里面的东西,但是只有前面15个字符串的东西,后面的就读不出来了,可能是sqlite作了些保密性的限制?只可以读出“SQLite format 3”,后面就没有了
— Begin quote from ____
lzfssyy 发表于 2012-6-19 20:37 url
string path = “mydatabase.sqlite”;
string o_path=CCFileUtils::getWriteablePath()+path;
unsigned lo …
— End quote
别把二进制的数据转成字符串处理
— Begin quote from ____
LeoCocos 发表于 2012-6-20 13:01 url
别把二进制的数据转成字符串处理
— End quote
那应该怎么处理呢?
— Begin quote from ____
LeoCocos 发表于 2012-6-20 13:01 url
别把二进制的数据转成字符串处理
— End quote
谢谢您的回复
请问我在ios下怎么把数据库的文件拷进手机呢?在程序安装的时候。。。。要不然我的据对路径怎么访问到数据库呢?
这个问提也只是在多平台移植的时候会有,应为先前已经设置了sqllite。。。额
你这个问题解决了么?我现在也有这个问题
请问这个问题解决了吗?我也是受这个问题的困扰。发现在data里面的mydatabase.sqlite文件是空的,怎么不可以从assets里面拷这个文件到data/data/projectName?
private static String DB_PATH = “/data/data/org.cocos2dx.projectName/databases/”;
private static String DB_NAME = “mydatabase.sqlite”;
private static String ASSETS_NAME = “mydatabase.sqlite”;
private void copyBigDataBase() throws IOException{
InputStream myInput;
String outFileName = DB_PATH + DB_NAME;
OutputStream myOutput = new FileOutputStream(outFileName);
myInput = this.getAssets().open(ASSETS_NAME);
byte] buffer = new byte;
int length;
while ((length = myInput.read(buffer))>0){
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myInput.close();
myOutput.close();
}
void DBManager::initialize()
{
//打开一个数据库,如果该数据库不存在,则创建一个数据库文件
string path = CCFileUtils::getWriteablePath();
path += “…/pirate/dataFiles/mydatabase.sqlite”;
result = sqlite3_open(path.c_str(), &pDB);
}
我现在这个问题还未解决,在C++代码里面解决不了,我想在C++里面就直接拷那个文件过去,但是拷过去是空的,“你想在android那层实现的话,网上例子很多的”,但是我不知道怎么查,所以找不到。。。请求帮助