android下 assets文件夹下sqlite数据库资源及其他资源问题

比如要用一个已经编好的数据库文件来获取游戏中的资源(只读),貌似很难啊,有没有方法做到呢?
在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那层实现的话,网上例子很多的”,但是我不知道怎么查,所以找不到。。。请求帮助