2

我是编程新手,并且渴望使用 cocos2dx 和 sqlite 制作游戏。但是我遇到了这个问题,我找不到一个例子或如何做到这一点。

我要做的第一件事是从已按范围过滤的表中随机选择一行。例如,有一个有 100 行的表。如果我在 D 列的值 1 ~ 10 之间进行过滤,则会产生 20 行。我想从这 20 个中随机选择一个。

其次,对于随机选择的行,我想收集 5 个不同的值,但到目前为止,我无法找到关于如何收集它们的工作示例。

这是我尝试提出但不起作用的代码:

  • 询问
int MinColumnD = 1;
int Max ColumnD = 10;
int Dice =  ( rand() % 19 ) + 1;
char sql_query[100];
sprintf(sql_query, "SELECT A, B, C, D, E FROM SQList WHERE (ColumnD BETWEEN %d AND %d) ORDER BY RANDOM() LIMIT 1", MinColumnD, MaxColumnD);
std::list<INFO> details;
sqlite3_exec(DB, sql_query, CallBack, &details, &errorMessage);

*感谢 CL 的评论,我更新了上述查询以包含 order by random() Limit 1。但是,当我运行它并进入该部分时,我在 xcode 上收到此错误:

 Thread 1
 0 sqlite3_exec
 0x54cbd8: movl 60(%ebx), %eax   < Thread 1: EXC_BAD_ACCESS (code=1, address=0x444e418e)

这似乎只发生在我将“ORDER BY RANDOM()”作为查询的一部分时

  • 打回来
int CallBack( void * pOutCount, int argc, char ** argv, char **azColName ){

std::list<Class::INFO> *pList = (std::list<Class::INFO >*)pOutCount;
Class::INFO items;
items._A = argv[0];
items._B = atoi(argv[1]);
items._C = atoi(argv[2]);
items._D = atoi(argv[3]);
items._E = atoi(argv[4]);
pList->push_back( items );
return 0;

}
  • 结构
struct Class::INFO {

std::string _A;
int _B;
int _C;
int _D;
int _E;

};

*也许是因为 sqlite 查询不完整,所以我没有正确得到结果,但我不确定我如何能够从 std::list 中获取返回的值列表。认为在查询之后我可以调用列表中的组件来获取如下值是否正确:

std::string A = details._A;
int B = details._B;
int C = details._C;
int D = details._D;
int E = details._E;

请帮忙!

4

1 回答 1

0

您不知道哪些rowids 最终会出现在过滤结果中,因此您不能使用它们。

要从过滤结果中获取一些随机记录,首先对其进行随机排序,然后获取其中的第一条记录:

SELECT A, B, C, D, E
FROM SQList
WHERE ColumnD BETWEEN ? AND ?
ORDER BY RANDOM()
LIMIT 1
于 2012-11-21T17:41:39.110 回答