应用应该做什么
该应用是一个测验应用,多选4个可能的答案(只有1个是正确的),具有多个难度级别和一些问题类别。
我有一个有问题的表,一个有答案的表和一个有难度级别的表,我与我不再联系的人共同开发了(他做了SQL和数据库工作,这就是为什么我挣扎着)。 有几种测验模式,但对于这个问题,让我们专注于标准'测验模式(例如Easy,Medium,Hard,根据难度级别加载问题,并且工作完美)和“定制”模式。模式(在测验开始之前,用户选择了一个或多个类别,这些类别不起作用)。
获取标准测验模式答案的工作代码如下 - 再次,这有效:
cursor = getReadableDatabase().rawQuery(
String.format(
"SELECT a.%s %s, question_id, a.text text, is_correct " +
"FROM %s a JOIN %s q ON a.question_id = q.%s " +
"JOIN %s l ON q.level_id = l.%s WHERE l.level = ? AND q.is_active = 1",
BaseColumns._ID, BaseColumns._ID,
ANSWERS_TABLE_NAME, QUESTIONS_TABLE_NAME, BaseColumns._ID,
LEVELS_TABLE_NAME, BaseColumns._ID
),
new String[]{Integer.toString(level)}
我的问题
以下是获取自定义测验模式答案的代码。让我们说用户选择测验类别'历史记录'和'技术' (甚至只是其中一个类别)。当我运行此特定查询时,测验加载正常,但没有显示答案:
cursor = getReadableDatabase().rawQuery(
String.format(
"SELECT a.%s %s, question_id, a.text text, is_correct " +
"FROM %s a JOIN %s q ON a.question_id = q.%s WHERE q.category = ? AND q.is_active = 1 ",
BaseColumns._ID, BaseColumns._ID,
ANSWERS_TABLE_NAME, QUESTIONS_TABLE_NAME, BaseColumns._ID
),
new String[]{thisQuestionCategory});
更多信息
我很高兴发布有关数据库或应用程序的任何信息(表格,列名,Java代码等,请问 - 我不想立即将其全部转储)。
数据库/表格信息
根据要求,有关表格的一些信息:
最后
我知道我的其余代码可能存在缺陷导致此问题,但SQL查询似乎是最好的起点,因为它是我最不熟悉的领域。我已经完成了其余代码的逻辑,没有发现任何问题,但如果我们无法发现SQL的任何问题,我可以发布Java代码,以便您可以看到应用程序如何结合在一起。谢谢你的时间。
答案 0 :(得分:1)
考虑以下示例表: -
Base.Columns._ID
解析为的值(即_id不是根据您的屏幕截图ID)。< / LI>
您的SQL将解析为(假设通过thisQuestionCategory传递的类别为 HISTORY ): -
SELECT a._id _id, question_id, a.text text, is_correct
FROM quiz_answers a
JOIN quiz_questions q ON a.question_id = q._id
WHERE q.category = 'HISTORY' AND q.is_active = 1
;
然后结果将是: -
即。功能上似乎没有任何问题。
您可以添加如下内容: -
Log.d("CURSORINFO",String.valueOf(cursor.getCount())+ " rows were extracted.");
然后运行并检查日志以查看正在提取的行数。
如果数字为0,请尝试删除where子句(例如下面的代码)并重新运行。如果仍然检索0行,那么很可能没有连接数据。即要包括答案,它必须引用一个问题。
cursor = this.getReadableDatabase().rawQuery(
String.format(
"SELECT a.%s %s, question_id, a.text text, is_correct " +
"FROM %s a JOIN %s q ON a.question_id = q.%s",
BaseColumns._ID, BaseColumns._ID,
ANSWERS_TABLE_NAME, QUESTIONS_TABLE_NAME, BaseColumns._ID
), null);