[PSP教程05]使用SQL数据库



掌叔
2008-06-05 17:04:35

摘自:TOPOC studio
作者:newcreat
在进行游戏制作时不免会与大量的数据打交道.例如三国志系列,足球经理系列,大菠萝的装备库,各类网游的装备库等等.还有什么公交车查询系统啊,火车时刻表等等.处理这些数据需要用到数据库.sql数据库是数据库的一种.在这里我就不再介绍sql数据库的知识了,假定读者具有一定的sql语言基础.

本节的目标:一个数据查询功能.

步骤:

首先新建一个数据库,这里用一个小程序sqlitecc.exe来建数据库,命名为infodata.db,填如一些内容,作为示意这里填了些三国武将,考虑到演示联合查询,这里建了2个表.首先可以在这里实验sql语句对不对,例如我要查询3号记录的五围数值.

select heroinfo.name,ti,wu,zhi,mei,age,herotype.name from heroinfo,herotype where heroinfo.id=3 and heroinfo.type=herotype.id;

测试好了写程序吧.
[attach]19[/attach]
接着建立一个程序,我偷个懒
这里采用lesson2的部分,我原封不动拷贝了一份,然后改里边的内容.
主要就是:
#include "CppSQLite3.h" //头文件
#include
#include
#ifdef WIN32      //库连接
#pragma comment(lib,"libsqlite.lib")
#pragma comment(lib,"libcppsql.lib")
#pragma comment(lib,"SDL_ttf.lib")
#endif
CppSQLite3DB db; //增加一个CppSQLite3DB变量
可能大家还记得lesson2是从一个数组里读的内容,现在改为从数据库里读.
这个函数就用到了上面的测试语句.用来读取武将五围.q.fieldValue(i)返回的是查询结果的第几列.q.nextRow();是到结果的下一行.
char* CreateInfoByid(int id)
{
static char buffer[1024]={0};
static char querybuf[1024]={0};
memset(querybuf,0,1024);
try
{
   db.open("infodata.db");
  sprintf(querybuf,"select heroinfo.name,ti,wu,zhi,mei,age,herotype.name from "
     " heroinfo,herotype where heroinfo.id=%d and heroinfo.type=herotype.id;",id);
  CppSQLite3Query q = db.execQuery(querybuf);
  if (!q.eof())
{
sprintf(buffer,"%s 体力%s 武力%s 智力%s 魅力%s 年龄%s 类型 %s", q.fieldValue    (0),q.fieldValue(1),q.fieldValue(2),q.fieldValue(3),
  q.fieldValue(4),q.fieldValue(5),q.fieldValue(6));
}
  db.close();
}catch (CppSQLite3Exception& e){

printf("%s
",e.errorMessage());
}
return buffer;
}
//这个是读记录多少的.
int GetInfoCount()
{
int count = 0;
try
{
   db.open("infodata.db");
   CppSQLite3Query q = db.execQuery("select count(*) from heroinfo;");
  if (!q.eof())
  {
count = atoi(q.fieldValue(0));

  }
   db.close();
}catch (CppSQLite3Exception& e){

printf("%s
",e.errorMessage());
}
return count;
}
以上就是查询,熟悉sql的人基本问题不大.
下面是显示,按d键(psp上是圆圈键)到一条记录
[attach]20[/attach]
编译:
1 psp版编译 将他拷贝到demo下make SCEkxpoit即可,注意把资源文件一起拷入到__xx_目录
(psp版把char.png,char2.png,gamebg.png,msgbox.png,simkai.ttf,infodata.db 拷贝到__SCE__lesson4 不然会运行出错)
2 windows版编译,这里需要重新替换一下libcppsql.lib,libsqlite.lib,因为我当初打包的时候没有将这2个库编译成为多线程版本,这里需要多线程版的.替换之后打开工程编译即可,不然会有linkerrorxxx ptype,替换部分可以下载,也可以自己编译.本节最后有自行编译这2个库的方法.
(运行时请将lesson2的资源char.png,char2.png,gamebg.png,msgbox.png,simkai.ttf拷贝过来)
本课下载
[url]http://code.google.com/p/topoc/downloads/list[/url]
附录:编译多线程的libcppsql.lib,libsqlite.lib
打开src下的工程libnge_winsrcsqlite-3.3.17win32libsqlite.dsw 编译时选择
[attach]21[/attach]
同理libcppsql也是这样,编译完成后覆盖原来旧的即可(libnge_winlibsqlitelibs)下的那2个
-----------------------------------------
VS2005下编译libsqlite,libcppsql:
1 打开工程,并移除shell.c(shell.c没有用到,但是vs2005的函数(access和isatty)变了,以后链接会有问题,所以干脆去掉).
2 直接编译,然后拷贝lib到libnge_winlibsqlitelibs
另 VS2005编译本课请看教程00最后,区别是附加依赖中再加入 libsqlite.lib,libcppsql.lib即可