java - 无法从 JOINed 表中获取正确的信息
问题描述
应用程序应该做什么
该应用程序是一个测验应用程序,选择 4 个可能的答案(只有 1 个是正确的),具有多个难度级别和多个问题类别。
我有一张有问题的表格,一张有答案的表格,还有一张难度级别的表格,我和一个我不再联系的人共同开发了这些表格(他做了 SQL 和数据库工作,这就是我为什么挣扎)。有几种测验模式,但对于这个问题,让我们专注于“标准”测验模式(例如,简单、中等、困难,它根据难度级别加载问题,并且效果很好)和“自定义”模式(其中一个或多个类别由用户在测验开始之前选择,这不起作用)。
获得标准测验模式答案的工作代码如下 - 再次,这有效:
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 代码,以便您了解应用程序是如何组合在一起的。感谢您的时间。
解决方案
考虑以下示例表:-
- 请注意,id列已命名为_id以反映
Base.Columns._ID
解析为的值(即 _id 不是 id 根据您的屏幕截图)。
并且您的 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,那么您的问题在其他地方(稍后)。
如果数字为 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);
推荐阅读
- function - 这个本地函数可以在范围外访问,有什么解释吗?
- android - 是否有可能一次在多个回收站视图项目中选择(突出显示)文本?
- oracle - oracle DB 是否能够返回时区区域而不仅仅是偏移量?
- safari - Safari 桌面 Web 共享 API 中缺少“复制”选项?
- chatbot - 如何使用调度程序在 Rasa 表单的 request_slot 函数中通过机器人显示消息?
- oracle - 如何更改 Oracle 19c 的静态和动态参数
- kubernetes - 如何使用 kubernetes java 客户端获取所有 Kubernetes Deployment 对象?
- laravel - PhpStorm 中的自动关闭 Laravel Blade 指令不起作用
- html - 带有 Bootstrap 的 HTML:按钮右对齐,div 居中在新行中
- javascript - 数组打字稿删除元素并将其放回数组