我在编程方面很陌生,并且有意使用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;
请帮忙!
答案 0 :(得分:0)
您不知道哪个rowid
会在过滤结果中结束,因此您无法使用它们。
要从过滤结果中获取一些随机记录,请首先对其进行排序randomly,然后排序take the first record:
SELECT A, B, C, D, E
FROM SQList
WHERE ColumnD BETWEEN ? AND ?
ORDER BY RANDOM()
LIMIT 1