在win32和MacOS上,这个库的使用没啥特别,但是在Android上,却无法直接读取。
这里要说明,Android不能读取的原因,是因为对数据库的 *** 作必须有root权限,也就是说,我们的应用程序只能对系统提供的特定目录中的数据库文件进行 *** 作。
这个目录,cocos2.1.3可以通过CCFileUtils::sharedFileUtils()->getWritablePath()来获得。
也就是说,我们需要把资源目录下的sliqte库文件,复制到CCFileUtils::sharedFileUtils()->getWritablePath()中,才可以对其进行 *** 作。
对于这种情况,我的解决方案是,在AppDelegate.cpp中,做如下实现
bool isFileExist(const char* pFileName)
{
if(!pFileName)return false
std::string filePath = CCFileUtils::sharedFileUtils()->getWritablePath()
filePath+=pFileName
FILE *pFp = fopen(filePath.c_str(),"r")
CCLog(filePath.c_str())
if(pFp)
{
fclose(pFp)
return true
}
return false
}
void copyData(const char* pFileName)
{
std::string strPath = CCFileUtils::sharedFileUtils()->fullPathForFilename(pFileName)
unsigned long len=0
unsigned char* data =NULL
data = CCFileUtils::sharedFileUtils()->getFileData(strPath.c_str(),"r",&len)
std::string destPath = CCFileUtils::sharedFileUtils()->getWritablePath()
destPath+= pFileName
FILE *pFp=fopen(destPath.c_str(),"w+")
fwrite(data,sizeof(char),len,pFp)
fclose(pFp)
delete []data
data=NULL
}
bool AppDelegate::applicationDidFinishLaunching()
{
#if (CC_TARGET_PLATFORM !=CC_TARGET_WIN32)//Android下需要复制数据文件
//检查数据库文件是否已经提取
if(isFileExist("dbd_user_save.db")==false)
{
copyData("dbd_user_save.db")//要使用的sqlite库文件
}
#endif
//下略
在程序启动时,检查sqlite是否存在,不存在,则复制一份。
转载自,你再研究下
http://blog.csdn.net/xujiayin/article/details/9221851
1)下载sqlite源代码,并解压到工程中[这步不需要了,cocos2dx中已经加入了sqlite,只需引用头文件sqlite3.h就可以了]:减压到工程中(shell.c不需要),在xcode中如下:
2) 打开数据库:
先用sqlite工具创建一个数据库,叫test.db;(工具可以使用sqlite提供的命令行工具;在sqlite下载页面中的Precompiled Binaries );
把test.db拷贝到Resource文件夹下,并加入工程,如下图:
然后调用如下代码,打开数据库:
[cpp] view plaincopy
std::string filename = CCFileUtils::sharedFileUtils()->fullPathForFilename("test.db")
result = sqlite3_open(filename.c_str(), &pDB)
CCLog(filename.c_str())
if( result != SQLITE_OK )
CCLog( "打开数据库失败,错误码:%d ,错误原因:%s\n" , result, errMsg )
else
CCLog("成功地打开了数据库")
3)创建表和插入数据:
[html] view plaincopy
//创建表,设置ID为主键,且自动增加
result=sqlite3_exec( pDB, "create table MyTable_1( ID integer primary key autoincrement, name nvarchar(32) ) " , NULL, NULL, &errMsg )
if( result != SQLITE_OK )
CCLog( "创建表失败,错误码:%d ,错误原因:%s\n" , result, errMsg )
//插入数据
sqlstr=" insert into MyTable_1( name ) values ( '克塞' ) "
result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg )
if(result != SQLITE_OK )
CCLog( "插入记录失败,错误码:%d ,错误原因:%s\n" , result, errMsg )
//插入数据
sqlstr=" insert into MyTable_1( name ) values ( '葫芦娃' ) "
result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg )
if(result != SQLITE_OK )
CCLog( "插入记录失败,错误码:%d ,错误原因:%s\n" , result, errMsg )
//插入数据
sqlstr=" insert into MyTable_1( name ) values ( '擎天柱' ) "
result = sqlite3_exec( pDB, sqlstr.c_str() , NULL, NULL, &errMsg )
if(result != SQLITE_OK )
CCLog( "插入记录失败,错误码:%d ,错误原因:%s\n" , result, errMsg )
4)查询
对数据库进行查询,有两种方式:1)sqlite3_prepare_v2 + sqlite3_step + sqlite3_column_text + sqlite3_finalize2) sqlite3_exec
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)